HTTP/2协议不能与okhttp一起使用

Baj*_*dda 14 android retrofit okhttp retrofit2 okhttp3

我正在使用带有okhttp 2.4.0的Retrofit 1.9.到目前为止,我们在服务器端禁用了SPDY协议(我通过检查).服务器端的启用协议是HTTP/2(我通过检查).

所以我认为okhttp将尝试使用HTTP/2(最新的一个协议)进行api调用,但它在Android设备4.2.2 samsung S4上使用HTTP/1.1 -

D/Retrofit : OkHttp-Selected-Protocol: http/1.1
Run Code Online (Sandbox Code Playgroud)

有人告诉我Android设备直到5.0 才支持SPDY(我没有任何证据),因此该设备从未尝试过使用SPDY连接.但我确信我们的服务器根本没有使用SPDY我自己使用上面的链接检查了它.

并且okhttp开始支持HTTP/2,因为它是2.3.0版本,请参见此处.

如果我在上面的Android 5.0中使用相同的东西,我在生产应用程序上获得了相同配置(okhttp 2.4.0和Retrofit 1.9)的异常 -

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)
Run Code Online (Sandbox Code Playgroud)

有两个修复 -

  1. 强制okhttp只使用http/1.1 -

    OkHttpClient客户端=新的OkHttpClient(); client.setProtocols(Arrays.asList(Protocol.HTTP_1_1));

注意 - 我们不能使用Protocol.HTTP_2或Protocol.SPDY_3,因为如果OkHttp可用,它将自动使用HTTP/2,但是您无法禁用HTTP/1.1.

  1. 并将okhttp2.4.0升级到okhttp 3.

但是应用程序已经投入生产,所以我无法在应用程序上进行这两项更改,客户端要求我对此进行解释 - " 为什么应用程序突然停止运行?昨天它正在运行但现在发生了什么? "

- 应用程序在不支持HTTP/2的所有服务器端点上正常工作.我正在使用已经支持HTTP/2的Sucuri.

我真的没有任何解释 -

  1. 真的android不支持低于5.0的Android设备上的http/2协议(因为应用程序与okhttp 2.4.0工作正常)?
  2. Okhttp 2.4.0是不是很好地支持HTTP/2,如果它是支持那么为什么它在4.4.2设备上选择http/1.1协议?
  3. 如果在服务器端支持,Android设备是否总是尝试使用HTTP/2协议?(可能在我的情况下,它正在尝试使用HTTP/2协议,而Okhttp 2.4.0没有正确处理它,这就是为什么它在5.0以上的设备中失败).
  4. 应用程序突然停止工作的真正原因是什么?(我当时认为可能会有一些升级或丢弃,但是无法正常处理,导致应用停止工作).
  5. 自2015年以来,Sucuri已经支持HTTP/2,然后配置更改我的应用程序停止工作?(昨天我的应用程序正在使用okhttp2.4.0并在相同端点上使用改进版1.9处理所有设备.)

所以我想要一个更好的解释或证明,以便我可以向我的客户解释.

这是我遵循的一些链接 - okhttp更改日志讨论,来自okhttp团队的回复.

谢谢.快乐编码:)