【发布时间】:2020-08-25 15:37:23
【问题描述】:
我在 POST 请求中接收到一些 XML 有效负载,并希望看到收到的有效负载以进行调试。
下面(我的自定义 WebFilter)代码按预期记录 URI 和请求标头,但不记录请求正文/有效负载,我的反应代码一定有问题 -
final ServerHttpRequest request = exchange.getRequest();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
LOGGER.info("Request: uri={}", request.getURI());
LOGGER.info("Request: headers={}", request.getHeaders().entrySet());
request.getBody().doOnNext(dataBuffer -> {
try {
Channels.newChannel(baos).write(dataBuffer.asByteBuffer().asReadOnlyBuffer());
String body = new String(baos.toByteArray());
LOGGER.info("Request: payload={}", body);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
我查看了 Brian 对下面帖子的回复并关注了它,但由于没有代码,我可能犯了一些愚蠢的错误
How to log request and response bodies in Spring WebFlux
更新代码
@Configuration
public class RequestFilter implements WebFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(RequestFilter.class);
@Override
@Order(Ordered.HIGHEST_PRECEDENCE)
public Mono<Void> filter(ServerWebExchange serverWebExchange,
WebFilterChain webFilterChain) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
serverWebExchange.getRequest().getBody().doOnNext(dataBuffer -> {
try {
Channels.newChannel(baos).write(dataBuffer.asByteBuffer().asReadOnlyBuffer());
String body = new String(baos.toByteArray());
LOGGER.info("Request: payload={}", body);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
return webFilterChain.filter(serverWebExchange);
}
}
【问题讨论】:
-
你在这里打破链
request.getBody().doOnNext( ... -
@ThomasAndolf - 你的意思是我需要在 doOn 之前对其进行平面映射?谢谢!
-
不,我的意思是您似乎忽略了返回值stackoverflow.com/a/61541336/1840146
-
所以如果我 doOnNext().subscribe() 我得到了所需的请求正文,但是就像你在上面提到的答案中解释的那样,我没有可用的数据供进一步使用。我已经多次浏览了您的帖子,但找不到放置“返回 Mono.empty()”的正确位置。谢谢!
-
好吧,你显然以前从未使用过 webflux。这不是命令式编程。您需要始终保持联系,您不能只写
request.getBody().doOnNext( ...而忽略响应。请制作一个可重复的小示例,以便我了解更大的图景。你的小代码 sn -p 不够用。
标签: java spring-boot spring-webflux project-reactor