Ote*_*ten 0 java spring-boot project-reactor spring-webflux
我在 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();
}
}
});
Run Code Online (Sandbox Code Playgroud)
我查看了布赖恩对下面帖子的回复并遵循了它,但由于没有代码,我可能犯了一些愚蠢的错误
更新代码
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
除了你在错误的地方提取身体之外,你做的部分是正确的。您必须在一个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();
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
这应该在每个传入的 Http 请求上记录您的请求正文。
| 归档时间: |
|
| 查看次数: |
4575 次 |
| 最近记录: |