8

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

4

2 回答 2

15

要允许多次response.getBody()调用,请将您的 ClientHttpRequestFactory 包装在 BufferingClientHttpRequestFactory 中。

ClientHttpRequestFactory requestFactory = 
    new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory());
restTemplate.setRequestFactory(requestFactory);
于 2014-10-17T00:41:21.223 回答
6

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

于 2012-06-20T15:47:06.187 回答