首页 文章

改造java.net.ProtocolException:预期':status'标头不存在

提问于
浏览
2

在工作应用程序中突然发生网络调用失败并出现协议异常 . 该应用程序一直工作到昨天,今天所有的网络呼叫都失败了 . 这些调用可以正常使用HTTP和一些HTTPS,但我的 生产环境 endpoint 除外 .

似乎应用程序不仅仅在我使用的 https endpoint 上工作,而是与其他https endpoints 一起工作,我试过了 .

我用这种方式解决了问题 -

OkHttpClient client = new OkHttpClient();
client.setProtocols(Arrays.asList(Protocol.HTTP_1_1));

并且我的问题解决了,除了这个,将我使用过的库okhttp2升级到okhttp3后也正常工作 https endpoint .

  • 我不明白可能是什么原因?

  • 如果是okhttp2的问题,为什么它最近工作?

  • 为什么它在某个特定的 endpoint 上出现问题并且在某些终端上工作正常?

我跟着thisthis链接,但我仍然不明白什么是真正的问题 .

Note 1: - This is working fine in Samsung S4 (Android verison 4.4.2) device. and in logs showing "OkHttp-Selected-Protocol: http/1.1" but it's not working in Android 5.1.1, 6.0.1, 7.1 & Android 8.1.0

Note 2: - It was working perfectly without setting any explicitly HTTP1.1 protocol but it suddenly stopped working (in device 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)

1 回答

  • 1

    你的崩溃来自 SpdyTransport.java ,这是发生了什么的线索 . SPDY已被弃用,正在逐步淘汰 . 服务器配置的更改最能解释您所看到的内容 . 可能是更新,删除或修改对SPDY的支持 . 升级到okhttp3是您的应用程序的正确修复程序 . Okhttp3不支持SPDY,因此不会尝试 Build SPDY连接 . 旧服务器使用某些 endpoints 而非其他 endpoints 的原因是由运行不同软件且具有不同配置的服务器解释的 .

    它工作并继续在4.4.2设备上工作的原因是android直到5.0才支持SPDY,因此该设备从未尝试使用SPDY连接 .

相关问题