Java TestRestTemplate-在不破坏主体的情况下记录响应
为了记录请求和响应,我添加了一个LoggingRequestInterceptor,它实现了clienthttpprequestinterceptor 响应主体是一个流,如果我将其读取到我的拦截器中,TestRestTemplate将无法将其反序列化到我的对象模型中。换句话说,当我调用testRestTemplate.get…时,我总是会返回空对象(即使我看到对象是我的响应) 要解决RestTemplate的此问题,可以使用BufferingClientHttpRequestFactory来修复它。我不知道如何为TestRestTemplate修复它 我尝试将BufferingClientHttpRequestFactory添加到RestTemplate的实例中,然后使用该实例包装TestRestTemplate:Java TestRestTemplate-在不破坏主体的情况下记录响应,java,spring-boot,resttemplate,Java,Spring Boot,Resttemplate,为了记录请求和响应,我添加了一个LoggingRequestInterceptor,它实现了clienthttpprequestinterceptor 响应主体是一个流,如果我将其读取到我的拦截器中,TestRestTemplate将无法将其反序列化到我的对象模型中。换句话说,当我调用testRestTemplate.get…时,我总是会返回空对象(即使我看到对象是我的响应) 要解决RestTemplate的此问题,可以使用BufferingClientHttpRequestFactory来修复
restTemplateBuilder.configure(restTemplate);
…但是根本没有日志记录
这就是我添加日志拦截器的方式
public static RestTemplateBuilder withInterceptors() {
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
interceptors.add(new LoggingRequestInterceptor());
return new RestTemplateBuilder()
.interceptors(interceptors);
}
publicstaticrestemplatebuilderwithinterceptors(){
列表拦截器=新的ArrayList();
add(新的LoggingRequestInterceptor());
返回新的RestTemplateBuilder()
.拦截器(拦截器);
}
最后,我想:
1.记录响应主体
2.将其反序列化为对象模型(如果启用日志记录,现在为空)调试请求/响应的最简单方法是在属性中设置:
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);
调试请求/响应的最简单方法是在属性中设置:
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);
非常感谢你!我也找到了另一种方法。见下:非常感谢!我也找到了另一种方法。见下文: