我正在使用一个简单的Spring Interceptor类来记录我的Android应用程序中RestTemplate对象的所有REST请求/响应。到目前为止一切正常。
public class LoggerInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body,
ClientHttpRequestExecution execution) throws IOException {
Log.d(TAG, "Request body: " + new String(body));
// ...more log statements...
ClientHttpResponse response = execution.execute(request, body);
Log.d(TAG, "Response Headers: " + response.getHeaders());
return response;
}
初始化时我打电话:
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
LoggerInterceptor loggerInterceptor = new LoggerInterceptor();
interceptors.add(loggerInterceptor);
restTemplate.setInterceptors(interceptors);
但是我无法在上面的方法中记录response.getBody()
因为InputStream被消耗一次并在以后再次使用时抛出IllegalStateException。有没有解决方法,以便我也可以记录响应正文?
答案 0 :(得分:15)
允许多个response.getBody()
调用将ClientHttpRequestFactory包装在BufferingClientHttpRequestFactory中。
ClientHttpRequestFactory requestFactory =
new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory());
restTemplate.setRequestFactory(requestFactory);
答案 1 :(得分:6)
自己实施ClientHttpResponse
并添加setBody(byte[] body)
方法并覆盖getBody
。在上面的代码中,您可以将字节数组存储在ByteArrayInputStream
中,记录您想要的内容,然后将字节数组设置回实现ClientHttpResponse
的类的实例中,然后您可以返回。