一、问题描述
后台使用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的几种用法