2011-02-28 50 views
3

我使用org.apache.commons.httpclient.HttpClient並需要設置響應編碼(由於某些原因,服務器在Content-Type中返回不正確的編碼)。我的方法是獲得作爲原始字節的響應並轉換爲String與所需的編碼。我想知道是否有一些更好的方法來做到這一點(例如,設置HttpClient)。感謝您的建議。使用HttpClient 3.1設置響應編碼

回答

3

我不認爲使用HttpClient 3.x APIs有更好的答案。

HTTP 1.1規範明確指出,客戶端必須遵守響應頭中指定的字符集,如果未指定字符集,請使用ISO-8859-1。 HttpClient API的設計假定程序員想要符合HTTP規範。顯然,您需要打破規範中的規則,以便您可以與不兼容的服務器通信。無法承受,這不是API設計人員需要明確支持的用例。

如果您使用的是HttpClient 4.x,您可以編寫自己的ResponseHandler將正文轉換爲HttpEntity,忽略響應消息的名義字符集。

2

的幾個注意事項:

  1. 服務器提供的數據,所以它的服務器來服務它以適當的格式。所以響應編碼由服務器而不是客戶端設置。然而,客戶可以建議服務器時,它會通過Accept and Accept-Charset喜歡什麼格式:

    Accept: text/plain 
    Accept-Charset: utf-8 
    

    然而,HTTP服務器通常不格式之間轉換。

  2. 如果選項1不起作用,那麼您應該查看服務器的配置。

  3. 當字符串作爲原始字節發送(並且始終是,因爲這是網絡傳輸的),總是定義了編碼。由於服務器產生這個原始字節,它定義了編碼。所以,你不能採取原始字節,並使用你選擇的編碼來創建一個字符串。您必須使用從String轉換爲字節時使用的編碼。

+0

嗨,我沒有服務器我的控制之下,它的Content-Type屬性返回錯誤enconding('HttpClient的。 getResponseBodyAsString()'從響應頭中的Content-Type屬性獲取編碼)。我試過設置Accept和Accept-Charset,就像你在請求標題中提到的一樣,但它不能幫助我。顯然它在服務器上是錯誤的,但我不是所有者,所以我不能對其進行更改。 –

+1

然後,你是運氣不好。 –

+0

+1的好評:-D –

0

聲明:我並不真正瞭解HttpClient,只能讀取API。

我會使用execute方法返回一個HttpResponse,然後.getEntity().getContent()。這是一個純粹的字節流,所以如果你想忽略服務器告訴的編碼,你可以簡單地將你自己的InputStreamReader包裝在它周圍。


好吧,貌似我有錯誤的版本(當然,也有太多的HttpClient類在那裏)。

但是和以前一樣,只是位於其他類:HttpMethod有一個getResponseBodyAsStream()方法,現在你可以包裝你自己的InputStreamReader了。 (或者一次獲得整個數組,如果它不是太大,並將其轉換爲字符串,就像你寫的那樣)。

我想嘗試改變響應並讓HttpClient分析它並不是正確的方法。


雖然,我建議發送一條消息給服務器管理員/網站管理員關於錯誤的字符集。

1

問候鄉親,

物權法的情況下,有人認爲這篇文章對谷歌搜索設置的HttpClient在UTF-8來寫。

這行代碼應該是得心應手......

response.setContentType("text/html; charset=UTF-8"); 

最佳

+2

嗨,感謝您的評論。你可以發佈完整的源代碼,清楚哪些對象是「響應」。 –

+0

問候,謝謝!我認爲我應該足以說HttpServletResponse響應 – HommeDeJava

+2

嗨,我使用Apache HttpClient下載數據。我沒有使用'Servlet',所以沒有'HttpServletResponse'。 –