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外的压缩算法。

你可能感兴趣的:(java,spring,cloud,gateway)