如何将 ServerHttpRequest/ServerHttpResponse 正文转换为字符串



想要在Spring API Gateway之上实现一个代理来记录请求/响应。我为传入请求和传出响应定义了自己的过滤器。

请求网关筛选器:

public class RequestGatewayFilter extends AbstractGatewayFilterFactory<RequestGatewayFilter.Config> {
private static final Logger logger = LogManager.getLogger(RequestGatewayFilter.class);
public RequestGatewayFilter() {
    super(Config.class);
}
@Autowired
CustomProxyLogger customLogger;
@Override
public GatewayFilter apply(Config config) {
    return (exchange, chain) -> {
        ServerHttpRequest.Builder builder = exchange.getRequest().mutate()
                .header(PR_CORRELATION_ID, UUID.randomUUID().toString());
        ServerHttpRequest request = builder.build();
        customLogger.logRequest(logger, request);
        return chain.filter(exchange.mutate().request(request).build());
    };
}

}

响应网关筛选器:

public class ResponseGatewayFilter extends AbstractGatewayFilterFactory<ResponseGatewayFilter.Config> {
private static final Logger logger = LogManager.getLogger(ResponseGatewayFilter.class);
public ResponseGatewayFilter() {
    super(Config.class);
}
@Autowired
CustomProxyLogger customLogger;
@Override
public GatewayFilter apply(Config config) {
    return (exchange, chain) -> {
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            ServerHttpResponse response = exchange.getResponse();
            customLogger.logResponse(logger, exchange);
        }));
    };
}

我必须记录请求和响应正文。我尝试了几种方法,例如如何正确读取 Flux并将其转换为单个输入流在这种情况下,映射函数不会随时执行。

还尝试将ServerHttpRequest转换为HttpServletRequest,以便从那里获取正文,但这会引发Cast异常。

没有一个奏效....

有什么想法或可能的方法来解决这个"得到身体"的问题吗?

只需创建一个Filter并记录所有请求,响应。

    @Component
    public class RequestResponseLoggingFilter implements Filter {
...
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse res = (HttpServletResponse) response;
            LOG.info(request);
            chain.doFilter(request, response);
            LOG.info(response);
        }
    }

最新更新