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 可能你从来没用过的拦截器 实用推荐