我使用org.apache.commons.httpclient.HttpClient
並需要設置響應編碼(由於某些原因,服務器在Content-Type中返回不正確的編碼)。我的方法是獲得作爲原始字節的響應並轉換爲String
與所需的編碼。我想知道是否有一些更好的方法來做到這一點(例如,設置HttpClient)。感謝您的建議。使用HttpClient 3.1設置響應編碼
回答
我不認爲使用HttpClient
3.x APIs有更好的答案。
HTTP 1.1規範明確指出,客戶端必須遵守響應頭中指定的字符集,如果未指定字符集,請使用ISO-8859-1。 HttpClient
API的設計假定程序員想要符合HTTP規範。顯然,您需要打破規範中的規則,以便您可以與不兼容的服務器通信。無法承受,這不是API設計人員需要明確支持的用例。
如果您使用的是HttpClient
4.x,您可以編寫自己的ResponseHandler
將正文轉換爲HttpEntity
,忽略響應消息的名義字符集。
的幾個注意事項:
服務器提供的數據,所以它的服務器來服務它以適當的格式。所以響應編碼由服務器而不是客戶端設置。然而,客戶可以建議服務器時,它會通過Accept and Accept-Charset喜歡什麼格式:
Accept: text/plain Accept-Charset: utf-8
然而,HTTP服務器通常不格式之間轉換。
如果選項1不起作用,那麼您應該查看服務器的配置。
當字符串作爲原始字節發送(並且始終是,因爲這是網絡傳輸的),總是定義了編碼。由於服務器產生這個原始字節,它定義了編碼。所以,你不能採取原始字節,並使用你選擇的編碼來創建一個字符串。您必須使用從String轉換爲字節時使用的編碼。
聲明:我並不真正瞭解HttpClient,只能讀取API。
我會使用execute方法返回一個HttpResponse,然後.getEntity().getContent()
。這是一個純粹的字節流,所以如果你想忽略服務器告訴的編碼,你可以簡單地將你自己的InputStreamReader包裝在它周圍。
好吧,貌似我有錯誤的版本(當然,也有太多的HttpClient
類在那裏)。
但是和以前一樣,只是位於其他類:HttpMethod
有一個getResponseBodyAsStream()
方法,現在你可以包裝你自己的InputStreamReader了。 (或者一次獲得整個數組,如果它不是太大,並將其轉換爲字符串,就像你寫的那樣)。
我想嘗試改變響應並讓HttpClient分析它並不是正確的方法。
雖然,我建議發送一條消息給服務器管理員/網站管理員關於錯誤的字符集。
問候鄉親,
物權法的情況下,有人認爲這篇文章對谷歌搜索設置的HttpClient在UTF-8來寫。
這行代碼應該是得心應手......
response.setContentType("text/html; charset=UTF-8");
最佳
嗨,感謝您的評論。你可以發佈完整的源代碼,清楚哪些對象是「響應」。 –
問候,謝謝!我認爲我應該足以說HttpServletResponse響應 – HommeDeJava
嗨,我使用Apache HttpClient下載數據。我沒有使用'Servlet',所以沒有'HttpServletResponse'。 –
- 1. 使用HttpClient編碼
- 2. 從XML設置響應編碼
- 3. 如何設置httpExchange響應的編碼?
- 4. 在WP8.1上設置HTTPClient編碼
- 5. 如何設置httpclient的字符編碼
- 6. Slim Framework:設置響應的編碼
- 7. 使用HttpClient設置CachePolicy後未經授權的響應
- 8. Android HttpClient響應
- 9. 響應編碼
- 10. 無響應的HttpClient
- 11. 在Spring 3.1中設置響應的內容類型mvc webservice
- 12. HttpClient:禁用分塊編碼
- 13. 設置響應狀態代碼
- 14. Django rest框架,設置api響應內容編碼爲gzip
- 15. 使用aiohttp檢測http響應編碼
- 16. HTML響應使用end_Json_Encoder ::編碼
- 17. 使用httplib/http.client獲取響應編碼
- 18. PDO設置服務器響應碼?
- 19. php設置soap服務器響應的編碼類型
- 20. jQuery:將json響應的編碼設置爲utf8
- 21. HttpClient設置內容傳輸編碼頭文件
- 22. 如何設置憑證編碼與Apache Android httpclient
- 23. 設置OWIN響應狀態代碼
- 24. JSON編碼響應
- 25. Spring MVC:CharacterEncodingFilter;爲什麼只強制設置響應編碼?
- 26. Node.js/Express - 如何設置響應字符編碼?
- 27. 嘗試使用HttpClient設置會話cookie
- 28. 如何使用Kohana的3.1「新的響應」或「響應::廠()」發送響應?
- 29. 使用JEditable設置自定義響應
- 30. 使用攔截器設置響應頭?
嗨,我沒有服務器我的控制之下,它的Content-Type屬性返回錯誤enconding('HttpClient的。 getResponseBodyAsString()'從響應頭中的Content-Type屬性獲取編碼)。我試過設置Accept和Accept-Charset,就像你在請求標題中提到的一樣,但它不能幫助我。顯然它在服務器上是錯誤的,但我不是所有者,所以我不能對其進行更改。 –
然後,你是運氣不好。 –
+1的好評:-D –