Feign踩坑记录:JSON parse error

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Feign踩坑记录:JSON parse error相关的知识,希望对你有一定的参考价值。

参考技术A

1.跟踪抛出异常的堆栈,发现在对返回结果的json解析中抛出异常

2.为什么会解析json失败呢,我们单独调用feign对应的接口是正常的,json也是正常可以解析的

3.难道feign的处理过返回的内容,又去跟了下fegin处理过程发现从response获取到流并没有任何异常,难道是出在了源头?但是源头又没有任何异常,此时思绪已经混乱,试着在google上查找有没有相关的问题,没想到在feign的github上找到类似问题 https://github.com/OpenFeign/feign/issues/934

4.问题已然发现,就是响应的内容经过gzip编码,feign默认的Client不支持gzip解码。那么在此跟踪一下feign的源码查看处理过程,从入口 SynchronousMethodHandler 开始,在122行开始获取响应内容

最终在 Logger 的102行找到响应流的读取,读取的流程如下:

5.最终问题出在feign使用默认的HttpURLConnection,并没有经过任何处理,导致读取的是gzip压缩后的内容。此时我们可以将其置换为Httpclient,其内部 ResponseContentEncoding 的 process 方法,取出了Content-Encoding并判断不为空,然后获取对应的处理方式。

上面所说feign默认的Client不支持gzip解码可能容易引起歧义,应该是fegin默认的Client对响应流不支持对gzip后的字节流进行解析,所以在序列化成对象时会存在解析问题。如果一定要接收可以使用 ResponseEntity<byte[]> 来接收,这样feign就不会对其反序列化了。至于 feign.compression.request.enabled=true , feign.compression.response.enabled=true 配置的内容在 FeignAcceptGzipEncodingInterceptor , FeignContentGzipEncodingInterceptor ,大致可以看出只是在请求头添加了Header而已

2020/3/13

spring已添加支持,SpringCloud版升级到Hoxton即可

https://github.com/spring-cloud/spring-cloud-openfeign/pull/230

2020/12/01

对于仍然存在问题的伙伴,可以直接使用OkHttp设置为feign的客户端(因为okhttp是默认支持gzip压缩),不需要关注spring cloud版本; 最简单的方案,也是最推荐的方案

以上是关于Feign踩坑记录:JSON parse error的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud - Feign 调用服务及传递参数踩坑记录

JAVA踩坑记录Feign调用服务时,get请求参数异常

使用 Hystrix Feign 记录请求和响应 json 有效负载

Feign踩坑源码分析 -- 请求参数分号变逗号

react踩坑记录——使用fetch获取json数据报错

fastjson踩坑之put