Feign踩坑记录JSONparseerror

阅读: 评论:0

2024年2月3日发(作者:)

Feign踩坑记录JSONparseerror

Feign踩坑记录JSONparseerror

feign版本

image

feign调用时报错:

解决方案

2:检查配置文件是否开启了feign的gzip压缩

如果找到该配置,请设置为false

排查思路

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

image

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

image

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

image

可以看到,feign默认的Client不支持设置了Content-Encoding为gzip的处理。看到此赶紧去看了下postman的Response Headers,果然发现了一行Content-Encoding:gzip!

image

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

response = RebufferResponse(Key(, logLevel, response, elapsedTime);

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

image

可以看出,使用的是HttpInputStream,并没有进行gzip解码的转换。我们可以手动进行gzip解码

image

此时可以看到解码后的内容正是我们预期的json!

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

image

可以看到,如果Content-Encoding对应的value是gzip,那么就从decoderRegistry取出gzip对应的GZIPInputStream。至此真相大白!

补充

2023/3/13

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

2023/12/01

配置文件添加以下配置

maven添加依赖

Feign踩坑记录JSONparseerror

本文发布于:2024-02-03 12:10:19,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170693342050322.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:内容   获取   读取
留言与评论(共有 0 条评论)
   
验证码:
排行榜

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23