美文网首页springboot 我爱编程
RestTemplate-支持gzip并解决中文乱码

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

作者: 8813d76fee36 | 来源:发表于2018-03-27 16:13 被阅读553次

    问题

    使用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

    • pom.xml添加HttpClient依赖
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.5</version>
            </dependency>
    
    • 创建RestTemplate
    @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;
        }
    

    相关文章

      网友评论

        本文标题:RestTemplate-支持gzip并解决中文乱码

        本文链接:https://www.haomeiwen.com/subject/ayrscftx.html