作者:leedaning | 来源:互联网 | 2023-07-30 17:07
RestTemplate 的getForEntity调用接口乱码
有时候,当我们在SpringBoot项目中使用restTemplate去调用第三方接口时,会发现返回的body中出现了乱码,百度一搜,基本都说是需要将restTemplate中的消息转换器中的StringHttpMessageConverter的字符编码由iso8859-1改为utf-8 ,但是发现并不管用,那么还有一种可能是第三方接口的数据经过GZIP压缩过
默认情况下,restTemplate使用的是JDK的HTTP调用器,并不支持GZIP解压,所以无法解析。
可以使用Apache 的HttpClient来解决,HttpClient其中内置了对于GZIP的支持
具体做法如下:
org.apache.httpcomponents
httpclient
4.5.3
@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> 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();