1. 程式人生 > >使用httpClient的POST方式呼叫webservice服務產生中文亂碼問題

使用httpClient的POST方式呼叫webservice服務產生中文亂碼問題

今天遇到做專案需要使用httpClient來遠端呼叫webservice服務,此專案中呼叫服務的一端和服務端都使用

org.springframework.web.filter.CharacterEncodingFilter過濾器來進行設定以POST方式提交資料的編碼格式,但是服務端獲取到的資料中文還是一直亂碼。

以下是自己寫的httpClient工具類的一個方法:

public static String doPost(String url, Map<String, String> param) {
		// 建立Httpclient物件
		CloseableHttpClient httpClient = HttpClients.createDefault();
		CloseableHttpResponse response = null;
		String resultString = "";
		try {
			// 建立Http Post請求
			HttpPost httpPost = new HttpPost(url);
			// 建立引數列表
			if (param != null) {
				List<NameValuePair> paramList = new ArrayList<>();
				for (String key : param.keySet()) {
					paramList.add(new BasicNameValuePair(key, param.get(key)));
				}
				// 模擬表單,此時需要設定資料的編碼格式,否則預設會以ISO_8859_1進行編碼
				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList,"UTF-8");
httpPost.setEntity(entity); } // 執行http請求 response = httpClient.execute(httpPost); resultString = EntityUtils.toString(response.getEntity(), "utf-8"); } catch (Exception e) { e.printStackTrace(); } finally { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } return resultString; }

如果在 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList,"UTF-8");不指定編碼方式的話,經過檢視原始碼發現會預設使用iso-8859-1對資料進行編碼,這就是導致亂碼的原因。



雖然解決了這個問題,但是還是有個疑惑,為什麼明明使用org.springframework.web.filter.CharacterEncodingFilter過濾器對post方式的資料的進行了編碼設定,但是還是需要在httpCilent中進行指定呢?如有高手知道,望告知!!!