我通过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自己使用.
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
| 归档时间: |
|
| 查看次数: |
12518 次 |
| 最近记录: |