问题表现
使用浏览器、Postman
访问服务端接口总是报错,返回一堆乱码。
查看服务器上的异常堆栈,发现是反序列化响应(为了打印日志)失败。
分析
使用 Accept-Encoding: gzip
会返回乱码,不使用则返回正常数据。
Accept-Encoding: gzip
是一个HTTP header
,前端通过这个 header
告诉服务器它可以接收 gzip
压缩后的数据。
如果服务器支持 gzip
,则会使用 gzip
算法压缩响应然后返回给前端;前端接收到压缩数据,会自动解压缩。
浏览器、Postman
都可以自动解压缩;所以如果服务端压缩了数据,我们在 浏览器、Postman
看到的也是正常的解压缩后的数据。
但是在 Java
程序 中如果没有解压缩这样的数据,而直接反序列化,则会报错。
解决方案
- 在
Java
程序中禁用Accept-Encoding
header
; - 判断请求是否有
Accept-Encoding: gzip
,如果有的话,还要判断第三方接口返回的是不是gzip
压缩后的数据,是的话,需要解压缩后才能反序列化。