Apache HttpClient 讀取響應亂碼問題總結

來源:互聯網
上載者:User

標籤:tor   排查   blank   讀取   jar   方法   pcl   illegal   turn   

Apache HttpClient 讀取響應亂碼問題總結setCharacterEncoding  Content-Type  HttpClient  起因

最近公司產品線研發人員調整,集中兵力做戰略產品,現在穩定產品迭代放慢。新的產品線當前有一個最初的版本,為了儘快瞭解業務,以 API 為入口,以 API 測試為手段,梳理目前的版本的商務程序。

在通過 HttpClient 對 API 進行訪問時,發現返回的字串中包含的中文為亂碼

環境
  1. JDK 1.8
  2. Servlet 3.0.x
  3. HttpClient 4.2.1
排查 疑因1

由於我們對 HttpClient 進行了再次封裝,封裝中使用 UTF-8 對響應資料進行編碼,之前其它產品線也都使用此 Jar 進行後端 Http API 訪問,均未出現亂碼的情況,所以初步懷疑是服務沒有設定響應編碼為 UTF-8
HttpClient 封裝代碼如下:

HttpEntity entity = response.getEntity();if (code >= 200 && code < 400) {    return EntityUtils.toString(entity, Charset.forName("UTF-8"));} else {    EntityUtils.consume(entity);    throw new IllegalArgumentException("請檢查串連是否正確,http return code=" + code);}

查看服務端代碼,發現設定了響應的字元編碼

response.setCharacterEncoding("UTF-8");

這樣服務端編碼與用戶端編碼都是 UTF-8,理論上不應出現亂碼的情況。
繼續看代碼,發現後端代碼沒有設定響應的 Content-Type,加上如下代碼:

response.setContentType("application/json;charset=utf-8");

再次進行測試,發現中文顯示正常。

疑因2

排除掉疑因1後,懷疑 setContentType() 方法和 setCharacterEncoding() 方法的處理不一致,遂查看源碼,如下:


enter description here

發現 setContentType 方法內部也會調用 setCharacterEncoding 方法,唯一的區別就是 setContentType 方法設定了 Content-Type 頭資訊

疑因3

排除掉2後,懷疑是 HttpClinet 對 ContentType 的處理有問題,並且 EntityUtils.toString(entity, Charset.forName("UTF-8"));
中的編碼沒有起作用。

查看其源碼,如下:


圖1


圖2

從圖1中可以看出來,如果沒有設定響應 ContentType,它會設定一個預設的 ContentType,從圖2中可以看來,設定的預設
Content-Type : text/plain;Charset=ISO-8859-1
Httpclient 會優先使用 ContentType 的編碼,只在 ContentType 編碼取不到的情況下,才會使用傳入的編碼(defaultCharset),而預設的 ContentType 始終帶有編碼(ISO-8859-1)。

所以,當服務端未顯式設定 ContentType 時,Httpclient 會使用 ISO-8859-1 編碼格式對響應資料進行編碼,而不是顯式傳入的 UTF-8 編碼,所以中文會出現亂碼。

總結

問題找到原因了,就好辦了。
我們只需要顯示設定服務端響應 Content-Type 即可,而且這樣可以避免通過瀏覽器提供者時出現亂碼,相容性更好。

個人認為這是 HttpClient 的一個 bug ,本想給官方提個 issue,但沒找到提 Bug 的入口(笑哭),如有人知道,煩請告知,不勝感激!

Apache HttpClient 讀取響應亂碼問題總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.