spring RestTemplate utf-16解码乱码
一、背景
请求的时候content-type utf-8, 响应的时候utf-16, 反序列化乱码,拿到的文本如下
笀∀琀漀欀攀渀∀㨀∀攀礀䨀栀戀䜀挀椀伀椀䨀䤀唀稀䤀一椀䤀猀䤀渀刀㔀挀䌀䤀㘀䤀欀瀀堀嘀䌀䨀㤀⸀攀礀䨀䨀娀䌀䤀㘀䤀洀䨀氀夀圀娀欀伀圀䴀㔀䰀圀儀㐀一樀䄀琀一䐀栀洀一匀椀䴀䐀儀㌀䰀圀夀稀娀樀刀樀夀稀挀㐀娀吀最 䴀匀䤀猀䤀洀嘀琀夀圀氀猀䤀樀漀椀挀䜀嘀瘀挀䜀砀氀儀䜀㔀瀀戀礀㔀樀戀㈀
二、解决方案
1) 让请求响应方提供utf-8编码的内容,响应方可能不支持;
2)升级spring-web的版本到最新的5.x,发生问题的时候使用版本为4.x;
3) 因为升级会带来很多兼容性问题,会扩大影响面带来很多回归测试,倾向于从现有的接口方式入手,采用框架支持的接口来直接反序列;
2.1 问题接口
1 ResponseEntity<String> responseEntity = getRestTemplate().exchange(uri, method, requestEntity, String.class); 2 3 BizClass instance = gson.fromJson(resultBody, BizClass.class);
由于反序列化为string,导致的乱码,实际内容编码传输可能是二进制;
2.2 用框架接口
ResponseEntity<BizClass>response = getRestTemplate().exchange(url, method, requestEntity, BizClass.class); BizClass instance = response.getBody();
由此,采用框架接口方式解决了 utf-16的乱码问题。
三、反序列化建议
- 不自己提取JSON串内容,再用Gson反序列化,一方面带来额外的反序列化开销;
- 采用框架现成的泛型接口来调用直接获取反序列化后的对象;