java - 读取 Android Spring 拦截器中的响应主体

标签 java android spring inputstream interceptor

我正在使用一个简单的 Spring 拦截器类来记录我的 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);

关于java - 读取 Android Spring 拦截器中的响应主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11119487/

相关文章:

spring - 如何将 Spring Boot 应用程序部署到 Tomcat 上的不同 URL?

java - Spring Data JPA 规范继承

java - 如何设置 Unix 服务器文件夹的相对路径来保存/创建 Excel 文件

java - Spring MVC - 如何在jsp页面上显示CSV文件中的每一行数据?

java - 如何正确处理并发?

java - While 循环查找空格字符 - Java

android - 错误 :compileSdkVersion android-21 requires compiling with JDK 7

android - TextView 不可见

spring - 如何推迟调用@PostConstruct,直到jUnit设置测试上下文

android - 您的 iPhone 或 Android 设备生成的移动热点是临时生成的还是 "regular"?