RestTemplate 的getForEntity调用接口乱码

当使用SpringBoot的restTemplate调用第三方接口出现乱码时,单纯改变StringHttpMessageConverter的字符编码可能无效。问题可能在于接口数据经GZIP压缩,而默认restTemplate不支持。解决方案是引入ApacheHttpClient,它内建了GZIP支持。通过配置restTemplate使用HttpComponentsClientHttpRequestFactory,并设置编码为UTF-8,可以有效解决乱码问题。
摘要由CSDN通过智能技术生成

当我们在SpringBoot项目中使用restTemplate去调用第三方接口时,会发现返回的body中出现了乱码,百度一搜,基本都说是需要将restTemplate中的消息转换器中的StringHttpMessageConverter的字符编码由iso8859-1改为utf-8 ,但是发现并不管用,那么还有一种可能是第三方接口的数据经过GZIP压缩过
在这里插入图片描述
原因:
默认情况下,restTemplate使用的是JDKHTTP调用器,并不支持GZIP解压,所以无法解析。

解决办法

可以使用Apache HttpClient来解决,HttpClient其中内置了对于GZIP的支持

添加依赖

		<dependency>
            <groupId>org.apache.httpcomponents.client5</groupId>
            <artifactId>httpclient5</artifactId>
        </dependency>

修改restTemplate配置:

@Bean
public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory()); //Apache Httpclient
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        return restTemplate;
    }

RestTemplate返回值乱码解决

调用RestTemplategetForEntity(String url, Class responseType, Object… uriVariables)的接口时,返回中文字是乱码的

  • 查看RestTemplate的源码发现
    在这里插入图片描述

  • 在构造函数中,看到红色圈出来的代码了吗,继续点击进去。
    在这里插入图片描述

  • StringHttpMessageConvert这个类中的设置的编码格式为GBK的编码格式,即图中的ISO-8859-1

在这里插入图片描述
修改编码方式

     RestTemplate restTemplate = new RestTemplate();
        List<HttpMessageConverter<?>> httpMessageConverters = restTemplate.getMessageConverters();
        httpMessageConverters.stream().forEach(httpMessageConverter -> {
            if(httpMessageConverter instanceof StringHttpMessageConverter){
                StringHttpMessageConverter messageConverter = (StringHttpMessageConverter) httpMessageConverter;
                messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
            }
        });
        //发送请求
        String jsonStr = restTemplate.getForEntity(url, String.class).getBody();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值