Проблема в том, что вы подписываетесь вручную в фильтре, что означает, что вы отключаете чтение запроса от остальной части конвейера. Вызов subscribe()
дает вам Disposable
, который помогает вам управлять базовым Subscription
.
Таким образом, вам нужно соединить весь процесс как один конвейер, примерно так:
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 , который делает именно это и даже больше.