2013-09-26 52 views
15

我正在創建HttpUrlConnection並需要設置多個自定義標頭。HTTP標頭中的非法字符

我想按照以下方法做一些事情,但標題地圖的內容需要來自單個字符串。在HTTP標頭名稱和HTTP標頭值中是否有任何非法或極少使用的字符?

HashMap<String, String> headers = new HashMap<String, String>(); 

// TODO: How can I fill the headers map reliably from a single string? 

HttpURLConnection c = (HttpURLConnection) url.openConnection(); 
for(Map.Entry<String, String> e : headers.entrySet()) 
    c.setRequestProperty(e.getKey(), e.getValue()); 

解決方案現在

似乎並不像任何HTTP標頭名稱包含任何空格(通常用破折號呢?),這樣我就可以使用該值分隔名稱單一空間。至於名稱值集合,似乎我搞砸了,因爲根據給定的答案,值可以包含幾乎任何東西。所以我剛挑選了一個我很確定很可能永遠不會使用的角色:§。如果事實證明它確實需要,我就必須調整我的代碼:P

Header1 Value1§Header2 Value2§Header3 Header3 
+0

請參閱:http://stackoverflow.com/questions/4400678/http-header-should-use-what-c​​haracter-encoding –

回答

8

[從@斯蒂芬-C接受的答案基本上是錯誤的,所以它似乎是值得糾正記錄,儘管。這個問題是相當古老]

從RFC7230相關的BNF是:

field-name = token 

token = 1*tchar 

tchar = "!"/"#"/"$"/"%"/"&"/"'"/"*"/"+"/"-"/
     "."/"^"/"_"/"`"/"|"/"~"/DIGIT/ALPHA 

的字符集是US-ASCII可見。

RFC 7230是不是你的問題更近,但在有關詳情,也不會改變什麼正式的RFC說2616

有現場名稱很強的慣例是要比更嚴格的是什麼RFC允許,並且這在各種實現中被實施到不同程度。字段名稱通常遵循[ASCII /數字]字符序列的模式,每個字的首字母(僅)大寫。單詞用一個連字符分隔。

因此,例如「HttpUrlConnection」應該是一個HTTP標頭名稱(而不是一個java標記),您可以將其稱爲'Http-Url-Connection'。

我記憶猶新,一旦追蹤到某些實現嚴格不足以不承認一個詞中的多個首字母(這恰好是首字母縮寫詞)就足夠嚴格。即它支付非常嚴格地遵循這個更受限制的格式。

@斯蒂芬-c是不正確的:

  • ISO-8859-1起着沒有參與現場的名字,儘管它可以在字段值中使用。

  • 在字段名中轉義的問題並不輕微。它不被標準支持。

  • https://bugzilla.mozilla.org/show_bug.cgi?id=601933涉及特定字段實現,而不是字段名稱。