OkHttp踩坑:报错java.lang.IllegalStateException: closed并解析response.body().string()的值

本文介绍了在后台使用OkHttp发送POST请求时遇到的`java.lang.IllegalStateException:closed`错误。问题在于调用了两次`response.body().string()`导致流被关闭。解决方案是将`response.body().string()`的值先存储到一个变量中,然后多次使用该变量。示例代码展示了如何正确处理响应并解析JSON数据。
摘要由CSDN通过智能技术生成

一、问题描述

后台使用OkHttp发送POST请求,请求成功后后台报错java.lang.IllegalStateException: closed。

  • 原因是流已经关闭,所以无法再进行操作。
  • OkHttp请求回调中response.body().string()只能有效调用一次,调用response.body().string()的时候数据流已经关闭了,再次调用就是提示已经closed。
  • 在实际开发中,响应主体 RessponseBody 持有的资源可能会很大,所以 OkHttp 并不会将其直接保存到内存中,只是持有数据流连接。只有当我们需要时,才会从服务器获取数据并返回。同时,考虑到应用重复读取数据的可能性很小,所以将其设计为一次性流(one-shot),读取后即 ‘关闭并释放资源’。

因为我第一次用response.body().string()的值写入了日志,第二次用response.body().string()的值来做了处理。

Response response = client.newCall(request).execute();
String responseStr = response.body().string();
log.warn("getUniUserInfo <--- Code:{} Body:{}", response.code(), responseStr);

UniUserInfo obj = JSON.parseObject(response.body().string(), UniUserInfo.class);
return obj;

二、问题解决

  • 将response.body().string()赋值给一个String变量就好了。
Response response = client.newCall(request).execute();
String responseStr = response.body().string();
log.warn("getUniUserInfo <--- Code:{} Body:{}", response.code(), responseStr);
String result_data = JSON.parseObject(responseStr).getString("data");

UniUserInfo obj = JSON.parseObject(result_data, UniUserInfo.class);
return obj;
  • 解析response.body().string()的值。
    我赋值给了responseStr,下面举例:

一、responseStr格式

{
 	"code": 200,
    "msg": "success",
    "data": {
        "token": "123"
    }
}
// 转换成object 
JSONObject jsonObject =JSON.parseObject(responseStr);
// 获取object中data、token等字段;  
JSON.parseObject(jsonObject.getString("data")).getString("token")

参考博文:
java.lang.IllegalStateException: closed
OkHttp踩坑记:为何 response.body().string() 只能调用一次?
response.body().string()在OkHttp请求中无法获取的问题
JSON.parseObject的几种用法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值