使用httpClient的POST方式呼叫webservice服務產生中文亂碼問題
阿新 • • 發佈:2019-01-21
今天遇到做專案需要使用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中進行指定呢?如有高手知道,望告知!!!