我正在使用 Spring 5、Netty 和 Spring webflux 来开发 API 网关。有时我希望网关停止请求,但我也想读取请求的主体以记录它,例如并向客户端返回错误。
我尝试通过订阅正文在 WebFilter 中执行此操作。
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
if (enabled) {
logger.debug("gateway is enabled. The Request is routed.");
return chain.filter(exchange);
} else {
logger.debug("gateway is disabled. A 404 error is returned.");
exchange.getRequest().getBody().subscribe();
exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
return exchange.getResponse().writeWith(Mono.just(exchange.getResponse().bufferFactory().allocateBuffer(0)));
}
}
当我这样做时,它在正文内容很小的情况下起作用。但是当我有一个大婴儿时,只读取通量的第一个元素,所以我不能拥有整个身体。知道怎么做吗?