阅读Android Spring Interceptor中的响应主体

Nac*_*chi 8 java spring android 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;
}
Run Code Online (Sandbox Code Playgroud)

在初始化时我打电话:

List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>();
LoggerInterceptor loggerInterceptor = new LoggerInterceptor();
interceptors.add(loggerInterceptor);
restTemplate.setInterceptors(interceptors);
Run Code Online (Sandbox Code Playgroud)

但是我无法登录response.getBody()上面的方法,因为InputStream被消耗一次并在以后再次使用时抛出IllegalStateException.有没有解决方法,以便我也可以记录响应正文?

Jat*_*aro 15

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

ClientHttpRequestFactory requestFactory = 
    new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory());
restTemplate.setRequestFactory(requestFactory);
Run Code Online (Sandbox Code Playgroud)


vah*_*idg 6

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