java - 如何通过改造同时恢复 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 返回响应。也就是说,不必放弃改造带来的泛型类型转换器的好东西
解决方案
您可以通过添加拦截器 ( 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;
推荐阅读
- excel - 基于相对单元格引用的动态条件格式公式
- ruby-on-rails - Rails 表单,遍历集合
- c# - 在C#中根据时区转换时间的问题
- php - 如何在 Laravel 5.8 中删除表?
- list - 基于Kotlin中的另一个ArrayList对ArrayList进行排序
- python-3.x - 将滚动条添加到 Tkinter 数据图表中,该数据图表超出屏幕底部
- amazon-web-services - Kubernetes 中是否有 API 可以获取特定 AWS 账户的所有卷?
- python-3.x - 从 xlsxwriter 生成的 Excel 图表中隐藏 #N/A 或空单元格
- typo3 - 将表单定义移动到扩展后,表单无法保存在表单编辑器中
- java - 在Java中通过枚举值参数化类型?