Spring使用RestTemplate傳遞POST資料出現亂碼

今天遇到的問題,把解決方法做個筆記

問題:使用RestTemplate傳遞POST資料的時候出現亂碼
環境:Spring 4.1.6
原因:encoding問題

今天的情境是我希望使用Spring操作RESTful API進行資料交換
但是在使用RestTemplate做遠端POST呼叫的時候丟過去的data因含有中文變成亂碼

程式碼大概長得如下

Put.java
private void putData(String memo) {
    RestTemplate restTemplate = new RestTemplate();
    //build post data

    MultiValueMap<String, String> body = new LinkedMultiValueMap<String, String>();
    body.add("memo", memo);

    //build basic http header

    HttpHeaders headers = buildHeader();
    HttpEntity<?> request = new HttpEntity<Object>(body, headers);

    ResponseEntity<Object> responseEntity = restTemplate.exchange(
        String.format("%s/%s/%s", "myurl", "put", "myid"),
        HttpMethod.POST,
        request,
        Object.class);
}

網路上用關進自搜尋RestTemplate+utf8的時候找到不少解法
有重新compile spring啦,設定StringHttpMessageConverter之類的
但是都沒辦法生效

但因為之前有用純jQuery+AJAX測試,server端沒問題
那就是client傳遞的資料有問題,這年頭這種編碼的問題不該這麼複雜

後來用google chrome的Simple REST Client跟截取的封包做交叉比對測試

後來發現其實只要簡單增加一個Content-Type的header加上charset就能解決這問題了

headers.add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
Put.java
private void putData(String memo) {
    RestTemplate restTemplate = new RestTemplate();
    //build post data

    MultiValueMap<String, String> body = new LinkedMultiValueMap<String, String>();
    body.add("memo", memo);

    //build basic http header

    HttpHeaders headers = buildHeader();

//Avoid POST data become garbled

    headers.add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

    HttpEntity<?> request = new HttpEntity<Object>(body, headers);

    ResponseEntity<Object> responseEntity = restTemplate.exchange(
        String.format("%s/%s/%s", "myurl", "put", "myid"),
        HttpMethod.POST,
        request,
        Object.class);
}
comments powered by Disqus