SpringCloudGateway获取magic-api的返回结果乱码

首先,可以确定的是magic-api拿到的数据是正常的。
同样的接口,当拿到大量数据时,业务网关对dataBuffer进行转义后乱码,无法获得正确的返回结果。
但是在增加筛选条件后,减少了返回结果的内容,网关便可以获取到正确的结果
返回结果中code大于2组,便无法获取正确的内容,猜测可能的原因有两点:
1、返回结果太长被截断了
2、由于返回结果太长超出了网卡的缓冲区,被自动进行分段后,在进行传输。
博客搜索,常规解决思路如下

DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
DataBuffer join = dataBufferFactory.join(dataBuffer);
byte[] content = new byte[join.readableByteCount()];
join.read(content);

已经采用了该写法,未解决问题

遂寻求公司大佬,以下在公司大佬的帮助下,转换解决思路,并解决问题
降低magic-api的版本
结果:网关可以获取正常的结果。
结论:跟业务网关的处理方式无关,问题应该出在magic-api的返回结果上。

比对1.4和1.7版本下magic-api接口返回结果的差异性
比对结果:
不一致的有:

Access-Control-Allow-Headers
1.4:没有
1.7.1:DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization
Access-Control-Expose-Headers
1.4:Response-With-Magic-API
1.7.1:Transfer-Encoding,Server,Access-Control-Allow-Origin,Access-Control-Allow-Methods,Connection,Access-Control-Allow-Headers,Date,Access-Control-Allow-Credentials,Content-Encoding,Vary,Set-Cookie,Content-Length,Content-Type
Cache-Control
1.4 无
1.7.1 no-cache, no-store, max-age=0, must-revalidate
Content-Encoding
1.4:gzip
1.7.1:gzip, deflate, br

通过上面几项的差异结合问题的现象,初步将问题锁定在Content-Encoding上,可能长度过长后,服务端采用了br的压缩算法,导致业务网关无法正确进行解析。

response.addHeader("Content-Encoding", "gzip");

验证过程,在magic-api的服务端中对response.header的content-encoding进行重新设置,只指定gzip算法,然后进行重试。
修改后,业务网关可以获取正确的返回值。证明本次问题产生的原因就在于服务端自动采取了gzip外的压缩算法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值