Okhttp3.14 流关闭
Posted
技术标签:
【中文标题】Okhttp3.14 流关闭【英文标题】:Okhttp3.14 Stream closed 【发布时间】:2022-01-03 11:40:42 【问题描述】:我在 3.14.9 版本中有一些关于 okhttp 的使用问题 如果我想为每个请求添加 LoggingInterceptor,我怎样才能得到响应体,它只能消耗一次?
接下来是我的尝试
public class LoggingRequestInterceptor implements Interceptor
@Override
public Response intercept(Chain chain) throws IOException
Request request = chain.request();
Response response = chain.proceed(request);
log.debug(
", , , , , , ",
request.url(),
request.method(),
JSONUtil.toJsonStr(request.body()),
request.headers(),
dup.body() == null ? null : dup.body().string());
return response;
会抛出stream关闭的异常,如何解决?
【问题讨论】:
【参考方案1】:为此使用peekBody
val client = OkHttpClient.Builder()
.addInterceptor
val response = it.proceed(it.request())
println(response.peekBody(1000000).string())
response
.build()
【讨论】:
【参考方案2】:我正在研究这个问题。我们可以使用缓冲区,在RequestBody-source-getBuffer中。
工作代码如下:
public String getResponseBody(Response response)
try
ResponseBody responseBody = response.body();
if (!ObjectUtil.isNull(responseBody))
BufferedSource source = responseBody.source();
source.request(Long.MAX_VALUE);
Buffer buffer = source.getBuffer();
return buffer.clone().readString(UTF8);
catch (IOException e)
log.error("get response body failed: ", e);
return null;
【讨论】:
我认为这使用了一些外部资源。 ObjectUtil,UTF8,日志。【参考方案3】:来自ernest-kiwele:
当响应正文在 try 块之外被读取时,将资源块与响应一起使用会导致此“关闭”问题:
try (Response response = client.newCall(request.build()).execute())
return response;
//response.close() called implicitly by the JVM
解决方法是重组代码以仅使用 try 块中的响应。
【讨论】:
以上是关于Okhttp3.14 流关闭的主要内容,如果未能解决你的问题,请参考以下文章
Websocket 关闭代码:1006 Node Android okhttp3 AmazonEc2
从 Android N (--min-api 24) 开始支持:okhttp3.Request okhttp3.Authenticator