改造网络调用在工作应用程序中突然出现协议异常而失败。该应用程序一直工作到昨天,今天所有的网络调用都失败了。除了我的生产端点之外,这些调用适用于 HTTP 和一些 HTTPS 。
似乎该应用程序不仅适用于我使用过的https 端点,而且适用于其他 https 端点,我试过了。
我以这种方式解决了问题-
OkHttpClient client = new OkHttpClient();
client.setProtocols(Arrays.asList(Protocol.HTTP_1_1));
和
并且我的问题解决了,除了在将我使用的库 okhttp2 升级到 okhttp3 之后也可以在相同的https 端点上正常工作。
- 我不明白真正的原因是什么?
- 如果 okhttp2 有问题,那么为什么它最近还在工作?
- 为什么它在特定端点上存在问题并且对某些端点工作正常?
注 1: - 这在三星 S4(Android 版本 4.4.2)设备中运行良好。并在显示“OkHttp-Selected-Protocol:http/1.1”的日志中,但它在 Android 5.1.1、6.0.1、7.1 和 Android 8.1.0 中不起作用
注意 2: - 在没有明确设置任何 HTTP1.1 协议的情况下,它可以正常工作,但它突然停止工作(在设备 5.1.1、6.0.1、7.1 和 Android 8.1.0 中)。
这是日志,
java.net.ProtocolException: Expected ':status' header not present at
com.squareup.okhttp.internal.http.SpdyTransport.readNameValueBlock(SpdyTransport.java:197)at com.squareup.okhttp.internal.http.SpdyTransport.readResponseHeaders(SpdyTransport.java:104)
at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:917)
at com.squareup.okhttp.internal.http.HttpEngine.access$300(HttpEngine.java:95)
at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:902)
at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:760)
at com.squareup.okhttp.Call.getResponse(Call.java:274)
at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:230)
at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:201)
at com.squareup.okhttp.Call.execute(Call.java:81)
at retrofit.client.OkClient.execute(OkClient.java:53)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at retrofit.Platform$Android$2$1.run(Platform.java:142)
at java.lang.Thread.run(Thread.java:818)