首页 > 解决方案 > 如何通过改造同时恢复 POJO 和原始响应字符串?

问题描述

FATAL EXCEPTION: main Process: com.packagename, PID: 11371 java.lang.IllegalStateException: Cannot read raw response body of a converted body.

在改造中,您只能读取一次 response.body(),因为它是一个流,并且在您调用或自动转换为返回类型.string()中的任何模型类时它会自动关闭。Response<T>如果您尝试阅读两次,则会收到上述错误。

我需要原始响应字符串和模型类。最好的方法是什么?我不想进行两次 API 调用。有什么方法可以复制响应正文吗?理想情况下,我想简单地让 String 和 T 返回响应。也就是说,不必放弃改造带来的泛型类型转换器的好东西

标签: javaandroidkotlinretrofitretrofit2

解决方案


您可以通过添加拦截器 ( https://square.github.io/okhttp/interceptors/ ) 并在返回响应之前复制 responsebody BufferedSource 来获取原始响应正文。我很难理解为什么有人会想要这样做。

Response response = chain.proceed(request);
ResponseBody responseBody = response.body();

ByteArrayOutputStream output = new ByteArrayOutputStream();
responseBody.source().getBuffer().copyTo(output);
String rawResponseBody = output.toString();

return response;

推荐阅读