朝阳博客

  • Article
  • Project
  • HTML+CSS
  • Bootstrap
  • JavaScript
  • jQuery
  • PHP
  • Java
  • Linux
  • MySQL
朝阳博客
一款专注于博客的响应式网站
  1. 首页
  2. 未分类
  3. 正文

RestTemplate或者AsyncRestTemplate设置编码

2023年3月29日 783点热度 0人点赞 0条评论

环境:

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-8和ISO-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> 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")));
    }

注意 :增加解析器后,最好在 post、put、delete 请求增加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);
标签: 暂无
最后更新:2023年3月29日

aiyao

你要加油,你喜欢的人还没结婚。

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2021 zhaoyangweb.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

冀ICP备2021020018号-1