阅读Android Spring Interceptor中的响应主体

时间:2012-06-20 12:23:45

标签: java android spring inputstream interceptor

我正在使用一个简单的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。有没有解决方法,以便我也可以记录响应正文?

2 个答案:

答案 0 :(得分:15)

允许多个response.getBody()调用将ClientHttpRequestFactory包装在BufferingClientHttpRequestFactory中。

ClientHttpRequestFactory requestFactory = 
    new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory());
restTemplate.setRequestFactory(requestFactory);

答案 1 :(得分:6)

自己实施ClientHttpResponse并添加setBody(byte[] body)方法并覆盖getBody。在上面的代码中,您可以将字节数组存储在ByteArrayInputStream中,记录您想要的内容,然后将字节数组设置回实现ClientHttpResponse的类的实例中,然后您可以返回。