解决RestTemplate的getForEntity调用接口乱码的问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
解决RestTemplate的getForEntity调⽤接⼝乱码的问题RestTemplate 的getForEntity调⽤接⼝乱码
有时候,当我们在SpringBoot项⽬中使⽤restTemplate去调⽤第三⽅接⼝时,会发现返回的body中出现了乱码,百度⼀搜,基本都说是需要将restTemplate中的消息转换器中的StringHttpMessageConverter的字符编码由iso8859-1改为utf-8 ,但是发现并不管⽤,那么还有⼀种可能是第三⽅接⼝的数据经过GZIP压缩过
默认情况下,restTemplate使⽤的是JDK的HTTP调⽤器,并不⽀持GZIP解压,所以⽆法解析。
可以使⽤Apache 的HttpClient来解决,HttpClient其中内置了对于GZIP的⽀持
具体做法如下:
引⼊pom坐标:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</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返回值乱码解决
⼀、在调⽤RestTemplate
的getForEntity(String url, Class responseType, Object… uriVariables)的接⼝时,返回中⽂字是乱码的
⼆、我们来分析下原因:
1、查看RestTemplate的源码发现
2、在构造函数中,看到红⾊圈出来的代码了吗,继续点击进去。
3、StringHttpMessageConvert这个类中的设置的编码格式为GBK的编码格式,即图中的ISO-8859-1
三、接下来我们改写代码
在⾃⼰代码⾥⾯获取RestTemplate对象之后,加上⼀段代码:
为了⼤家可以复制,我把代码粘贴出来了,如下所⽰:
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();
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。