RestTemplate响应乱码问题解决

问题描述

工作中交接了一个项目,发现了一个奇特的bug。
调用某个渠道获得响应,是乱码显示,首先排查其他渠道方,响应均为正常。联系后对方表示使用Postman调用响应正常,只能从我们这边入手查询。
使用curl -v调用渠道方接口也发现,响应的报文是正确,并未出现乱码现象。
仔细排查后发现!响应头里Content-Type中,application/json;charset=utf-8当中多了一个空格,正是这个空格的原因导致了RestTemplate无法解析响应,出现了乱码。但是渠道方近期无版本,不能配合改造,那只能从我们这边入手了。
在这里插入图片描述

RestTemplate源码解析

注意下面图里的两行代码
在这里插入图片描述
从响应中获取了contentType,转成MediaType,但在org.springframework.http.MediaType类中,是不包含带有空格格式的contentType

public static final String APPLICATION_JSON_VALUE = "application/json";
public static final String APPLICATION_JSON_UTF8_VALUE = "application/json;charset=UTF-8";

所以消息转换器的canRead方法,无法正确的解析,找到问题所在,那我们只需要让消息转换器能识别这种类型即可。

解决方法

@Autowired
RestTemplateBuilder builder;

private RestTemplate getRestTemplate() {
    List<HttpMessageConverter<?>> converters = builder.build().getMessageConverters();
    for (HttpMessageConverter<?> converter : converters) {
        if (converter instanceof MappingJackson2HttpMessageConverter) {
            try {
                List<MediaType> mediaTypeList = new ArrayList<>(converter.getSupportedMediaTypes());
                // 增加MediaType
                mediaTypeList.add(new MediaType("application/json; charset=utf-8"));
                ((MappingJackson2HttpMessageConverter) converter).setSupportedMediaTypes(mediaTypeList);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    RestTemplate restTemplate = builder.build();
    return restTemplate;
}

一个小小的空格引发的问题,浪费了许多时间去排查,写代码还是要规范,避免这种问题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章