gpt4 book ai didi

spring-webflux - 如何使用spring webflux读取请求正文

转载 作者:行者123 更新时间:2023-12-04 23:13:16 24 4
gpt4 key购买 nike

我正在使用 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)));
}
}

当我这样做时,它会在主体内容很小的情况下工作。但是当我有一个大男孩时,只读取通量的第一个元素,所以我不能拥有整个 body 。知道如何做到这一点吗?

最佳答案

这里的问题是您在过滤器中手动订阅,这意味着您将请求的读取与管道的其余部分断开连接。调用 subscribe()给你一个 Disposable帮助您管理底层 Subscription .

所以你需要把connect整个过程看成一个单独的pipeline,有点像:

Flux<DataBuffer> requestBody = exchange.getRequest().getBody();
// decode the request body as a Mono or a Flux
Mono<String> decodedBody = decodeBody(requestBody);
exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
return decodedBody.doOnNext(s -> logger.info(s))
.then(exchange.getResponse().setComplete());

请注意,将整个请求正文解码为 Mono意味着您的网关必须在内存中缓冲整个请求正文。
DataBuffer故意是低级类型。如果您想将其解码(即实现示例 decodeBody 方法)作为字符串,您可以使用各种 Decoder 之一。 Spring 中的实现,如 StringDecoder .

现在因为这是一个相当大和复杂的空间,您可以使用和/或查看 Spring Cloud Gateway ,它不仅可以做到这一点,而且还可以做得更多。

关于spring-webflux - 如何使用spring webflux读取请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50043489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com