[英]Spring WebFlux: How to access Request Body in HandlerFilterFunction
[英]How to log request body in spring Webflux Java
我在 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 对下面帖子的回复并遵循了它,但由于没有代码,我可能犯了一些愚蠢的错误
更新代码
@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);
}
}
除了在错误的地方提取身体外,您做的部分正确。 您必须在ServerHttpRequestDecorator
实现中执行此操作并将其插入WebFilter
实现中。
public class RequestLoggingDecorator extends ServerHttpRequestDecorator {
private static final Logger LOGGER = LoggerFactory.getLogger(RequestLoggingDecorator.class);
public RequestLoggingDecorator(ServerHttpRequest delegate) {
super(delegate);
}
@Override
public Flux<DataBuffer> getBody() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
return super.getBody().doOnNext(dataBuffer -> {
try {
Channels.newChannel(baos).write(dataBuffer.asByteBuffer().asReadOnlyBuffer());
String body = new String(baos.toByteArray(), StandardCharsets.UTF_8);
LOGGER.info("Request: payload={}", body);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
然后您可以在WebFilter
实现中配置它,如下所示:
@Configuration
public class RequestLoggingFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
ServerWebExchangeDecorator decorator =
new ServerWebExchangeDecorator(serverWebExchange) {
@Override
public ServerHttpRequest getRequest() {
return new RequestLoggingDecorator(serverWebExchange.getRequest());
}
};
return webFilterChain.filter(decorator);
}
}
这应该在每个传入的 Http 请求上记录您的请求正文。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.