RestTemplate或者AsyncRestTemplate设置编码

环境:

jdk: 8
spring-boot: 2.x
一、问题描述
  1. 在spring-boot 项目中使用RestTemplate和AsyncRestTemplate,RestTemplate发送请求时不会出现乱码,但是AsyncRestTemplate会出现乱码情况
二、问题分析
  1. 首先想到是加请求头 application/json;charset=utf-8 , RestTemplate没问题,AsyncRestTemplate依旧乱码。
HttpHeaders headers = new HttpHeaders();
// 等价  ContentType: application/json;charset=utf-8
headers.add(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType());
asyncRestTemplate.postForEntity(url, new HttpEntity<>(data,headers), ResponseModel.class);
  1. 断点查看 MessageConverters
  • RestTemplate : 有两个StringHttpMessageConverter ,分别对应 UTF-8ISO-8859-1 编码
     
    RestTemplate
  • AsyncRestTemplate : 只有一个StringHttpMessageConverter ,对应 ISO-8859-1 编码
     
    AsyncRestTemplate

综上所述,可以看到 AsyncRestTemplate 默认缺少 utf-8 的解析器 , 所以造成无法编码成utf-8

三、解决方式 (两种方式差不多)
  1. 增加一个 UTF-8 解析器 (第一种)
    private AsyncRestTemplate asyncRestTemplate ;

    @PostConstruct
    public void init(){ asyncRestTemplate = new AsyncRestTemplate() ; // 增加一个 utf-8 解析器 asyncRestTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8"))); } 
  1. 删除原有的 StringHttpMessageConverter , 然后重新添加 UTF-8 解析器 (第二种)
    private AsyncRestTemplate asyncRestTemplate ;

    @PostConstruct
    public void init(){ asyncRestTemplate = new AsyncRestTemplate() ; // 删除所有的 StringHttpMessageConverter Iterator<HttpMessageConverter<?>> iterator = asyncRestTemplate.getMessageConverters().iterator(); while (iterator.hasNext()) { final HttpMessageConverter<?> converter = iterator.next(); if (converter instanceof StringHttpMessageConverter) { iterator.remove(); } } // 添加 UTF-8 的解析器 asyncRestTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8"))); } 

注意 :增加解析器后,最好在 postputdelete 请求增加contentType 头信息,类似如下

HttpHeaders headers = new HttpHeaders();
// 等价  ContentType: application/json;charset=utf-8
headers.add(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType());
asyncRestTemplate.postForEntity(url, new HttpEntity<>(data,headers), ResponseModel.class);




转载于:https://www.cnblogs.com/powerwu/articles/9667829.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值