RestTemplate解析响应数据中文字符出现Unicode编码问题解决和源码剖析

开发者在使用restTemplate时遇到中文字符解析为Unicode的问题,尽管配置了UTF-8,问题在于响应数据类型和MessageConverter的匹配。类型转换为Object后成功解析,但接收字符串时出现异常,源码显示Content-Type缺失charset时会默认用UTF-8。问题还需进一步研究以给出全面解决方案。
摘要由CSDN通过智能技术生成

问题

基于上篇文章,开发过程中又遇到一个restTemplate问题:

restTemplate请求接口返回响应数据为json时,解析其中的中文字符出现Unicode编码

测试

接口如下:

测试代码:

觉得很奇怪,我的restTemplate配置类已经配置了String的MessageConverter的编解码为utf-8,而flask默认也是utf-8,没有做额外的配置,也没有其他中间组件的干预,理应不会出现这样的问题。

测试直接返回字符串

配置依然不变,但这次restTemplate能够完美解析没有出现乱码

问题浅层解决和分析

后面多方查找资料也没能得到解答,各种方式配置都试过了最后实在没办法。觉得可能是类型转换的问题,就把responseType由String改为Object

结果也能够成功解析了。

那么问题可能就是在类型转换上面,这部分和编码无实际问题关联。再试一下上面返回字符串的接口,responseType用Object接

结果抛了异常。

所以问题就出在返回接收的类型和响应数据的类型不匹配

源码剖析

跟进来的 extractData() 方法中能够看到负责解析数据的时一个MessageConverter列表,获取MediaType是获取响应头中的Content-Type,而 MessageConverter.canRead() 方法则是判断接收响应数据的类型和接口传回来的Content-Type是否匹配,再由此判断这个MessageConverter能否解析

而基于一开始的问题,继续跟源码可以看到StringMessageConverter中如果获取的Content-Type中没有指明chatset,那么默认用UTF-8,所以问题和字符串编解码并没有关系

总结

那么至于问题到底出在哪里,以及如何根治解决,加上上面用Object接收返回的字符串出现的类型不匹配异常的原因,还需要再多加研究,这部分就等以后有机会再给各位补上,或是有哪位大哥有自己更深层次独特的见解,也请多多指教

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值