访问OkHttp Response的正文字符串两次会导致IllegalStateException:closed

deg*_*ill 44 android okhttp

我通过OkHttp库实现我的http调用.一切正常,但我注意到,当我作为响应的字符串访问身体两次时,IllegalStateException将被抛出.也就是说,我(例如):Log.d("TAG", response.body().string())之后我真的想要使用那个字符串processResponse(response.body().string()).但是第二次调用会抛出异常消息closed.

怎么可能两次访问字符串导致失败?我想处理该响应而不需要添加包装器/虚拟对象只是为了保存一些值(如header,body,statuscode).

Pet*_*r F 60

有关问题的解释,请参阅Greg Ennis的回答.

但是,如果您无法轻松地将结果传递给变量,但仍需要访问响应主体两次,则还有另一个选项:

在读取之前克隆缓冲区.由此原始缓冲区既不清空也不关闭.看到这个片段:

String responseBodyString = response.peekBody(Long.MAX_VALUE).string();
Log.d("TAG", responseBodyString);
Run Code Online (Sandbox Code Playgroud)

这个方法在项目okhttp中的HttpLoggingInterceptor中由square自己使用.

  • 非常感谢人。真的需要这种方式,否则我需要在 20-30 个地方更改它:) (2认同)

Gre*_*nis 39

string所述响应方法将读取输入(网络)流并将其转换成一个字符串.所以它动态构建字符串并将其返回给您.第二次调用它时,网络流已经被消耗并且不再可用.

您应该将结果保存string到String变量中,然后根据需要多次访问它.


小智 7

ResponseBody body = response.peekBody(Long.MAX_VALUE);
String content = body.string();
//do something
Run Code Online (Sandbox Code Playgroud)

此代码获取响应正文并且不会消耗缓冲区。这是本期新增的api