问题
基于上篇文章,开发过程中又遇到一个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接收返回的字符串出现的类型不匹配异常的原因,还需要再多加研究,这部分就等以后有机会再给各位补上,或是有哪位大哥有自己更深层次独特的见解,也请多多指教