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

时间:2018-03-28 09:50:43

标签: android retrofit okhttp okhttp3 protocolexception

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

似乎应用程序不仅仅在我使用的 https端点上工作,但是我尝试使用其他https端点。

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

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

并且

我的问题解决了,除了这个,将我用过的库okhttp2升级到okhttp3后也可以正常使用相同的 https端点

  1. 我不明白什么是真正的原因?
  2. 如果它与okhttp2的问题那么为什么它最近有效?
  3. 为什么它在某个特定端点上出现问题并且对某些终端有效?
  4. 我关注thisthis链接,但我仍然不了解真正的问题。

    注1: - 这在Samsung 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)
    

2 个答案:

答案 0 :(得分:1)

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

它在4.4.2设备上工作并继续工作的原因是android在5.0之前不支持SPDY,因此该设备从未尝试过使用SPDY连接。

答案 1 :(得分:-1)

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

  

(例如:在我的情况下,我使用它在服务器上上传图片,也   获取内容的长度/图像大小)

这是一个较旧的版本(不是那么旧)或上一个版本,您应该为这两个实现相同的旧版本。

  

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

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

  

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

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