当我们在SpringBoot
项目中使用restTemplate
去调用第三方接口时,会发现返回的body
中出现了乱码,百度一搜,基本都说是需要将restTemplate
中的消息转换器中的StringHttpMessageConverter
的字符编码由iso8859-1
改为utf-8
,但是发现并不管用,那么还有一种可能是第三方接口的数据经过GZIP
压缩过
原因:
默认情况下,restTemplate
使用的是JDK
的HTTP
调用器,并不支持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返回值乱码解决
调用RestTemplate
的getForEntity(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();