1.我们在实际开发中由网关路由到业务系统处理后返回响应报文。对于返回小内容响应报文通过super.writeWith(fluxBody.map(dataBuffer -> {}))是没有问题的,
但有时业务系统需要返回过大的响应报文的时候就有问题了,fluxBody返回体会存在分段传输,从而导致返回的json报文只有一半,前端无法解析而导致错误。
解决方案如下:
既然返回内容过大存在分段传出,比如json传输了一半,另一半丢失,所以我们需要考虑报文拼装方式,只有报文全部返回才统一返回给前端。
大报文我们需要对fluxBody流循环拼接处理,所以改变方式如下,把fluxBody.map变为fluxBody.buffer().map,从而可以foreach循环Body体了。
代码如下:
public class WrapperResFilter implements GlobalFilter, Ordered {
private static Joiner joiner = Joiner.on("");//将 List 数据以""分隔进行拼接
@Override
public int getOrder() {
return -10;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取response的 返回数据
ServerHttpResponse originalResponse = exchang