RestTemplate 的getForEntity调用接口乱码

当我们在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();

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RestTemplate是Spring框架提供的一个用于发送HTTP请求的模板类,可以方便地进行HTTP通信。要使用RestTemplate调用HTTPS接口,需要进行以下步骤: 1. 导入相关依赖:在项目的pom.xml文件中添加Spring Web和Apache HttpClient的依赖。 ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> </dependencies> ``` 2. 创建RestTemplate对象:可以通过直接实例化RestTemplate类或者使用RestTemplateBuilder构建器来创建RestTemplate对象。 ```java RestTemplate restTemplate = new RestTemplate(); ``` 3. 配置SSL证书:由于HTTPS通信需要验证服务器的SSL证书,需要配置SSL证书的信任策略。可以通过创建HttpClient对象,并设置SSLContext和HostnameVerifier来实现。 ```java CloseableHttpClient httpClient = HttpClients.custom() .setSSLContext(SSLContexts.custom().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build()) .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) .build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); restTemplate.setRequestFactory(requestFactory); ``` 4. 发送HTTPS请求:使用RestTemplate的各种方法发送HTTPS请求,例如getForObject、postForObject等。 ```java String url = "https://example.com/api"; ResponseEntity<String> response = restTemplate.getForEntity(url, String.class); String responseBody = response.getBody(); ``` 以上是使用RestTemplate调用HTTPS接口的基本步骤。需要注意的是,为了安全起见,实际应用中可能需要更加严格的SSL证书验证策略,例如使用自定义的TrustManager来验证服务器证书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值