2

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

似乎该应用程序不仅适用于我使用过的https 端点,而且适用于其他 https 端点,我试过了。

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

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

并且我的问题解决了,除了在将我使用的库 okhttp2 升级到 okhttp3 之后也可以在相同的https 端点上正常工作。

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

我关注了这个这个链接,但我仍然不明白真正的问题是什么。

注 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)
4

2 回答 2

1

您的崩溃来自SpdyTransport.java哪个是正在发生的事情的线索。 SPDY已被弃用并正在逐步淘汰。服务器配置的更改是您所看到的最类似的解释。可能是删除或修改对 SPDY 支持的更新。升级到 okhttp3 是您的应用程序的正确修复。Okhttp3 不支持 SPDY,所以不会尝试建立 SPDY 连接。旧的与某些端点而不是其他端点一起工作的原因可以通过运行不同软件并具有不同配置的服务器来解释。

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

于 2018-03-30T02:06:30.437 回答
-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'

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

于 2019-09-11T10:25:25.167 回答