首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >访问OkHttp响应的正文字符串两次会产生IllegalStateException: closed

访问OkHttp响应的正文字符串两次会产生IllegalStateException: closed
EN

Stack Overflow用户
提问于 2015-01-13 20:54:09
回答 5查看 18.7K关注 0票数 57

我通过OkHttp库实现http调用。一切正常,但我注意到,当我两次以响应字符串的形式访问正文时,将抛出一个IllegalStateException。也就是说,我做了(例如):Log.d("TAG", response.body().string()),然后我实际上想要使用像processResponse(response.body().string())这样的字符串。但是第二个调用抛出了异常,消息为closed

两次访问一个字符串怎么会导致失败呢?我希望处理该响应,而不需要添加包装器/虚拟对象来保存某些值(如header、body、statuscode)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-01-13 21:00:45

响应上的string方法将读取输入(网络)流并将其转换为字符串。因此,它动态构建字符串并将其返回给您。第二次调用时,网络流已经被消耗,不再可用。

您应该将string的结果保存到一个字符串变量中,然后根据需要多次访问它。

票数 44
EN

Stack Overflow用户

发布于 2019-05-01 00:27:24

代码语言:javascript
复制
ResponseBody body = response.peekBody(Long.MAX_VALUE);
String content = body.string();
//do something

这段代码获取响应体,不会消耗缓冲区。这是this issue中新增的接口

票数 7
EN

Stack Overflow用户

发布于 2016-10-12 23:43:16

user2011622Greg Ennis的回答进行了一点扩展,我创建了一种方法,可以帮助您创建身体的完整克隆,允许您单独使用身体的每个副本。我自己在Retrofit2中使用了这种方法

代码语言:javascript
复制
/**
 * 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);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27922703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档