问题:
客户端,http请求头默认设置了'accept-encoding: gzip, deflate'
,服务端使用的nginx开启了gzip压缩,返回了压缩内容。客户端收到请求后没有进行解压缩,导致解析失败,打印出来的是压缩数据,误认为是乱码。
解决:
方法一:客户端将http头中的'accept-encoding: gzip, deflate'
去掉。(不推荐)
方法二:客户端接收到响应报文后,判断响应是否压缩(响应头中content-encoding
属性),如果已经压缩,则进行加压缩操作。
代码中使用了netty作为http客户端,netty这么优秀的框架,支持很多种codec,只需要将解压处理的handler
HttpContentDecompressor
加到netty的pipeline中就好了,注意位置。
问题发现以及排查过程:
同事对接了一个新的下游服务,发现下游服务返回“乱码”,客户端的代码在线上运行了很久,对接了很多下游,从来没有说乱码过。服务端也表示,自己接了很多客户端,也没有出现过乱码。两个一直运行正常的模块,接到一起就出现问题。大家都坚信自己的模按道理没有问题的。
服务端还表示:自己通过curl访问自己的服务就不会有乱码现象。