Android 上的 okhttp 出现错误,预期为 null,但 okhttp3.internal.http1.Http1Codec

Posted

技术标签:

【中文标题】Android 上的 okhttp 出现错误,预期为 null,但 okhttp3.internal.http1.Http1Codec【英文标题】:Got an error on okhttp on Android expected null but was okhttp3.internal.http1.Http1Codec 【发布时间】:2019-04-04 06:11:31 【问题描述】:

我收到了这个错误。从api获得响应后。 (我认为当应用程序读取响应时,因为它与 Http1Codec 相关)。有人知道吗?也很难复制。

(我们使用 okhttp 和 ApolloGraphQL )

Fatal Exception: java.lang.IllegalStateException
expected null but was okhttp3.internal.http1.Http1Codec

okhttp3.internal.connection.StreamAllocation.streamFinished (StreamAllocation.java:304)
okhttp3.internal.http1.Http1Codec$AbstractSource.endOfInput (Http1Codec.java:386)
okhttp3.internal.http1.Http1Codec$FixedLengthSource.read (Http1Codec.java:416)
okio.RealBufferedSource.request (RealBufferedSource.java:68)
okhttp3.logging.HttpLoggingInterceptor.intercept (HttpLoggingInterceptor.java:241)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121)
okhttp3.RealCall.getResponseWithInterceptorChain (RealCall.java:200)
okhttp3.RealCall$AsyncCall.execute (RealCall.java:147)
okhttp3.internal.NamedRunnable.run (NamedRunnable.java:32)

【问题讨论】:

我偷偷怀疑有一些与此有关。愿意分享吗? 【参考方案1】:

请注意,如果您的观察列表中有 response.body().string() 会导致您的代码失败。因为监视列表会自动运行。

ResponseBody responseBodyCopy = response.peekBody(Long.MAX_VALUE);
responseBodyCopy.string();

【讨论】:

Apollo 作为数据返回。我认为这个错误来自使用 okhttp 的 ApolloLib【参考方案2】:

当我们使用 response.errorBody() 或 response.body() 时,它将使用缓冲区。 所以值可能在我们得到 String 之前就消失了

而不是response.errorBody().toString

我们更好地使用

ResponseBody errorBody = Objects.requireNonNull(response.errorBody());
String errorString = errorBody.toString();
onFailure(new ApiError(response.code(), errorString));

【讨论】:

以上是关于Android 上的 okhttp 出现错误,预期为 null,但 okhttp3.internal.http1.Http1Codec的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅OKHttp出现错误 java.lang.IllegalStateException: Expected Android API level 21+ but was 19(代

证书固定不适用于 Android 上的 OkHttp

Okhttp NoClassDefFoundError

Android OKHttp 可能你从来没用过的拦截器 实用推荐

Android 9.0/P(android p指安卓9.0版本) okhttp3网络请求出错

Android 9.0/P(android p指安卓9.0版本) okhttp3网络请求出错