RestTemplate亂碼總結


(一)背景

現在的項目大多用的是spring框架,然后就方便的直接用RestTemplate,但是在實際使用時常常會發現出現亂碼的情況,今天總結下這些情況

(二)request亂碼

request亂碼就是,請求別人的接口,比如別人需要你的編碼格式是“UTF-8”,而我的是“ISO-8859-1”,那么別人解析我的body,就會出現亂碼的情況,這種情況的解決很簡單。

在這邊文章中,我已經對RestTemplate源碼做了分析,在寫body時,會先從我們的請求head中看是否有設置charset,如果沒有,HttpMessageConverter會用他們默認的編碼格式,比如StringHttpMessageConverter的默認編碼格式就是“ISO-8859-1,所以我們只需要這樣子設置就行

        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        HttpEntity request = new HttpEntity<>(jsonObject, headers);
        JSONObject response = restTemplate.postForObject("http://127.0.0.1:8089/getBodyTest", request, JSONObject.class);

(三)response亂碼

response亂碼就是,請求別人的接口,別人返回給我們的body編碼格式是“UTF-8”,而我的是“ISO-8859-1”,那么我們解析別人的body就會出現亂碼。

這種問題的出現是因為,別人返回的head中未設置charset,RestTemplate就會使用HttpMessageConverter的默爾編碼了。因為是別人返回的內容,我們無法串改別人的返回head,所以需要修改我們的HttpMessageConverter的編碼格式,以將別人的返回body轉換為string為例

String result = restTemplate.postForObject("http://127.0.0.1:8089/getBodyTest", request, String.class);

這樣子調用,我們就會采用StringHttpMessageConverter的默認編碼格式就是“ISO-8859-1”,那么將會出現亂碼。我們加這一行就可以解決string類型的亂碼問題

restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
String result = restTemplate.postForObject("http://127.0.0.1:8089/getBodyTest", request, String.class);

為什么set的是1這個位置呢?

因為在RestTemplate初始化中StringHttpMessageConverter是在第1的位置,第0是ByteArrayHttpMessageConverter

    public RestTemplate() {
        this.messageConverters.add(new ByteArrayHttpMessageConverter());
        this.messageConverters.add(new StringHttpMessageConverter());
        this.messageConverters.add(new ResourceHttpMessageConverter());
        this.messageConverters.add(new SourceHttpMessageConverter<Source>());
        this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());

        if (romePresent) {
            this.messageConverters.add(new AtomFeedHttpMessageConverter());
            this.messageConverters.add(new RssChannelHttpMessageConverter());
        }

        if (jackson2XmlPresent) {
            this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
        }
        else if (jaxb2Present) {
            this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
        }

        if (jackson2Present) {
            this.messageConverters.add(new MappingJackson2HttpMessageConverter());
        }
        else if (gsonPresent) {
            this.messageConverters.add(new GsonHttpMessageConverter());
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM