解决RestTemplate 的getForEntity调用接口乱码的问题

网友投稿 1429 2022-12-22

解决RestTemplate 的getForEntity调用接口乱码的问题

解决RestTemplate 的getForEntity调用接口乱码的问题

RestTemplate 的getForEntity调用接口乱码

有时候,当我们在SpringBoot项目中使用restTemplate去调用第三方接口时,会发现返回的body中出现了乱码,百度一搜,基本都说是需要将restTemplate中的消息转换器中的StringHttpMessageConverter的字符编码由iso8859-1改为utf-8 ,但是发现并不管用,那么还有一种可能是第三方接口的数据经过GZIP压缩过

默认情况下,restTemplate使用的是JDK的HTTP调用器,并不支持GZIP解压,所以无法解析

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

具体做法如下:

引入pom坐标:

org.apache.httpcomponents

httpclient

4.5.3

修改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> 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();

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数字一体化政务服务平台(政务服务中心一体化平台)
下一篇:小程序引流app(小程序引流推广方案)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~