我通过OkHttp库实现http调用。一切正常,但我注意到,当我两次以响应字符串的形式访问正文时,将抛出一个IllegalStateException
。也就是说,我做了(例如):Log.d("TAG", response.body().string())
,然后我实际上想要使用像processResponse(response.body().string())
这样的字符串。但是第二个调用抛出了异常,消息为closed
。
两次访问一个字符串怎么会导致失败呢?我希望处理该响应,而不需要添加包装器/虚拟对象来保存某些值(如header、body、statuscode)。
发布于 2015-01-13 21:00:45
响应上的string
方法将读取输入(网络)流并将其转换为字符串。因此,它动态构建字符串并将其返回给您。第二次调用时,网络流已经被消耗,不再可用。
您应该将string
的结果保存到一个字符串变量中,然后根据需要多次访问它。
发布于 2019-05-01 00:27:24
ResponseBody body = response.peekBody(Long.MAX_VALUE);
String content = body.string();
//do something
这段代码获取响应体,不会消耗缓冲区。这是this issue中新增的接口
发布于 2016-10-12 23:43:16
对user2011622和Greg Ennis的回答进行了一点扩展,我创建了一种方法,可以帮助您创建身体的完整克隆,允许您单独使用身体的每个副本。我自己在Retrofit2中使用了这种方法
/**
* Clones a raw buffer so as not to consume the original
* @param rawResponse the original {@link okhttp3.Response} as returned
* by {@link Response#raw()}
* @return a cloned {@link ResponseBody}
*/
private ResponseBody cloneResponseBody(okhttp3.Response rawResponse) {
final ResponseBody responseBody = rawResponse.body();
final Buffer bufferClone = responseBody.source().buffer().clone();
return ResponseBody.create(responseBody.contentType(), responseBody.contentLength(), bufferClone);
}
https://stackoverflow.com/questions/27922703
复制相似问题