Retrofit java.net.ProtocolException: Expected ':status' 标头不存在



改造网络调用失败,协议异常突然在工作应用中。该应用程序一直在工作到昨天,今天所有网络电话都失败了。这些呼叫与HTTP和一些HTTP一起工作,除了我的生产 endpoint

看来,应用程序不仅可以在我的使用过的 https endpoint 上使用,但是我尝试了其他HTTPS端点。

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

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

和我的问题解决了,除了将我的用过的库OKHTTP2升级到OKHTTP3之后,也可以使用相同的 https endpoint 正常工作。

  1. 我不明白真正的原因是什么?
  2. 如果OKHTTP2有问题,那么为什么它最近工作?
  3. 为什么在特定的端点上有问题且用于某些端子的正常工作?

我遵循此链接,但我仍然不明白真正的问题。

注意1: - 在三星S4(Android Verison 4.4.2(设备中工作正常。并在显示" OKHTTP选择协议: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、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)

您的崩溃来自SpdyTransport.java,这是发生的情况。SPDY已被弃用,正在淘汰。服务器配置的更改最喜欢您所看到的解释。可能会删除或修改对SPDY的支持。升级到OKHTTP3是您应用程序的正确修复程序。OKHTTP3不支持SPDY,因此不会尝试建立SPDY连接。旧的原因与某些端点一起起作用而不是其他端点的原因是运行不同软件并具有不同配置的服务器解释。

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

注意:如果您同时同时使用apache httpmime和改造使用apache httpmime旧版本。

(例如:就我而 获取内容lenghth/图像大小(

这是他的较旧版本(不是那么旧(或prev版本,您应该对这两个版本实现相同的旧版本。

实现'com.squareup.retrofit2:改造:2.0.2' 实现'org.apache.httpcomponents:httpmime:4.3.6'

这是他的新版本的改造,您应该使用旧版本apache httpmime。

实现'com.squareup.retrofit2:改造:2.3.0' 实现'org.apache.httpcomponents:httpmime:4.3.6'

非常感谢您,如果您喜欢我的解决方案,请投票给我。

相关内容

最新更新