2011-02-16 43 views
0

我必須使用HttpClient 2.0(不能使用任何更新的),並且我正在運行到下一個問題。當我使用該方法時(在這種情況下發布),它將參數「編碼」爲十六進制ASCII碼,並且「空格」變爲「+」(接收機不需要的東西)。HttpClient 2.0。參數「編碼」

有沒有人知道一種方法來避免它?

非常感謝。

回答

1

即使你的瀏覽器這樣做,將空間字符爲+。看到這裏http://download.oracle.com/javase/1.5.0/docs/api/java/net/URLEncoder.html

它編碼的URL,轉換爲UTF-8一樣的字符串。

當編碼字符串,適用下列規則:

  • 字母數字字符 「a」 到 「z」, 「A」 到 「Z」 和 「0」 至 「9」 保持在相同。
  • 特殊字符「。」,「 - 」,「*」和「_」保持不變。
  • 空格字符「」被轉換爲加號「+」。
  • 所有其他字符都是不安全的,並且首先使用某種編碼方案將其轉換爲一個或多個字節。然後每個字節由3個字符的字符串「%xy」表示,其中xy是該字節的兩位十六進制表示。推薦使用的編碼方案是UTF-8。但是,出於兼容性原因,如果未指定編碼,則使用平臺的默認編碼。

而且,在這裏看到http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

  1. 控制名稱和值轉義。空格字符被替換爲+', and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by%HH',百分號和兩個十六進制數字代表字符的ASCII碼。換行符被表示爲「CR LF」對(即'%0D%0A')。

  2. 控制名稱/值列在它們出現在文檔中的順序。該名稱與值=' and name/value pairs are separated from each other by &'分開。


要回答你的問題,如果你不想進行編碼。我想,URLDecoder.decode會幫你撤銷的編碼字符串。

+0

是的,我知道,但我捕獲的痕跡,它看起來像接收器只有當它沒有編碼。但是,感謝這些信息,閱讀所有內容是很好的:-) – raspayu 2011-02-16 09:13:51

1

理論上你可以通過構建包含手工參數的查詢字符串或請求體避免這種情況。

但是,這將是一個壞事做,因爲HTML,HTTP,URL和URI規範所有任務是保留在請求參數字符編碼。如果你違反了這個規定,你可能會發現服務器端的HTTP堆棧,代理等等將你的請求視爲無效,或者以其他方式行爲不端。

正確的方式來處理這個問題是做下列之一:

  • 如果服務器是用Java EE技術實現,使用相關的servlet API方法(如ServletRequest.getParam(...))來獲取請求參數。這些將爲您處理任何解碼。

  • 如果參數是URL查詢字符串的一部分,您可以實例化一個Java URL或URI對象,並使用getter將查詢的編碼返回給您。

  • 如果您的服務器來實現一些其他的方式(或者,如果你需要拆洗請求的URL查詢字符串或POST數據自己),然後用URLDecoder.decode或相當於刪除%編碼和替換+的...在找出查詢和參數邊界等位置之後。