springboot 我爱编程

RestTemplate-支持gzip并解决中文乱码

2018-03-27  本文已影响553人  8813d76fee36

问题

使用RestTemplate访问如下接口:

http://wthrcdn.etouch.cn/weather_mini?city=北京

发现响应body为乱码。

请求代码

String url = "http://wthrcdn.etouch.cn/weather_mini?city={city}";
Map<String, String> paramMap = new HashMap<>();
paramMap.put("city", "北京");

ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, paramMap);
String body = responseEntity.getBody();
body乱码

解决

通过查看Header信息发现,该返回结果是gzip压缩过的,因此需要为RestTemplate添加gzip支持。

Content-Encoding为gzip

关于添加gzip的方法即使用apache的HttpClient替换默认客户端实现。

官方文档说明

https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/integration.html#rest-client-access

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.5</version>
        </dependency>
@Bean
    public RestTemplate restTemplate() {

        //使用HttpClient替换默认实现
        HttpClient httpClient = HttpClientBuilder.create().build();
        ClientHttpRequestFactory requestFactory = 
                new HttpComponentsClientHttpRequestFactory(httpClient);

        RestTemplate restTemplate = new RestTemplate(requestFactory);
        //解决中文乱码
        restTemplate.getMessageConverters()
                .set(1, new StringHttpMessageConverter(Charsets.UTF_8));
        return restTemplate;
    }
上一篇 下一篇

猜你喜欢

热点阅读