[英]Cannot properly read reqest body in interceptor - Spring BOOT 2.0.4
[英]Read the response body in an Android Spring 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。 有没有解决方法,以便我也可以记录响应正文?
要允许多个response.getBody()
调用,请将您的ClientHttpRequestFactory包装在BufferingClientHttpRequestFactory中。
ClientHttpRequestFactory requestFactory =
new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory());
restTemplate.setRequestFactory(requestFactory);
自己实现ClientHttpResponse
并添加setBody(byte[] body)
方法并覆盖getBody
。 在上面的代码中,您可以将字节数组存储在ByteArrayInputStream
,记录您想要的内容,然后将字节数组设置回实现ClientHttpResponse
的类的实例中,然后您可以返回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.