在使用RestTemplate做Http交互的时候,响应体的中文解析出来之后就乱码了,全是?????
RestTemplate配置
RestTemplate build = new RestTemplateBuilder().build();
使用RestTemplate请求之后得到的响应结果是这样的
{
"code": 500,
"success": false,
"data": null,
"msg": "??????"
}
这个问题我首先想到的是RestTemplate的MessageConverter消息转换器,首先找到RestTemplate解析response的地方
方法路径:org.springframework.web.client.HttpMessageConverterExtractor#extractData
如下图
MediaType contentType = getContentType(responseWrapper);这里获取到了response的媒体类型,然后根据这个媒体类型的编码格式去做的read
而我的请求响应的媒体类型是
注意这里的字符集编码是charset=ISO-8859-1
这里为什么会拿到charset=ISO-8859-1呢?让我们来看看,RestTemplate中StringHttpMessageConverter默认的字符集是啥
好了,屁话不多说。改一下
for (int i = 0; i < build.getMessageConverters().size(); i++) {
if (build.getMessageConverters().get(i) instanceof StringHttpMessageConverter) {
build.getMessageConverters().set(i, new StringHttpMessageConverter(StandardCharsets.UTF_8));
}
if(build.getMessageConverters().get(i) instanceof MappingJackson2HttpMessageConverter){
((MappingJackson2HttpMessageConverter) build.getMessageConverters().get(i))
.setSupportedMediaTypes(ListUtil.of(MediaType.ALL));
}
}
最终bean如下
重启并测试响应体
{
"code": 500,
"success": false,
"data": null,
"msg": "不合法的文件大小"
}













网友评论