TestRestTemplate - 记录响应而不破坏正文

问题描述 投票:0回答:2

为了记录请求和响应,我添加了一个实现ClientHttpRequestInterceptor的LoggingRequestInterceptor ......

响应主体是一个流,如果我读取它的拦截器,它将无法用于TestRestTemplate将其反序列化为我的对象模型。换句话说,当我调用testRestTemplate.get时...我总是会找回空对象(即使我看到对象是我的响应)。

要为RestTemplate解决这个问题,可以使用BufferingClientHttpRequestFactory来修复它。我不知道如何为TestRestTemplate修复它...

我试图将BufferingClientHttpRequestFactory添加到RestTemplate的一个实例,然后用该实例包装TestRestTemplate:

restTemplateBuilder.configure(restTemplate);

......但是根本没有记录。

这就是我添加日志拦截器的方法。

public static RestTemplateBuilder withInterceptors() {
        List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
        interceptors.add(new LoggingRequestInterceptor());

        return new RestTemplateBuilder()
                .interceptors(interceptors);
    }

最后,我想:1。记录响应体2.将其反序列化为对象模型(如果我打开日志记录,它现在为null)

java spring-boot resttemplate
2个回答
0
投票

调试请求/响应的最简单方法是在属性中设置:

logging.level.org.apache.http=DEBUG

并使用BufferingClientHttpResponseWrapper:

public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(LoggingRequestInterceptor.class);

    @Override
    public ClientHttpResponse intercept(final HttpRequest request, final byte[] body,
            final ClientHttpRequestExecution execution) throws IOException {
        ClientHttpResponse response = execution.execute(request, body);

        response = log(request, body, response);

        return response;
    }

    private ClientHttpResponse log(final HttpRequest request, final byte[] body, final ClientHttpResponse response) {
        final ClientHttpResponse responseCopy = new BufferingClientHttpResponseWrapper(response);
        logger.debug("Method: ", request.getMethod().toString());
        logger.debug("URI: ", , request.getURI().toString());
        logger.debug("Request Body: " + new String(body));
        logger.debug("Response body: " + IOUtils.toString(responseCopy.getBody()));
        return responseCopy;
    }

}

并设置:

LoggingRequestInterceptor loggingInterceptor = new LoggingRequestInterceptor();
restTemplate.getInterceptors().add(loggingInterceptor);

0
投票
TestRestTemplate testRestTemplate = new TestRestTemplate();

testRestTemplate.getRestTemplate()
                .setRequestFactory(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
© www.soinside.com 2019 - 2024. All rights reserved.