レトロフィットネットワークコールは、動作中のアプリで突然プロトコル例外で失敗します。アプリは昨日まで機能していましたが、今日はすべてのネットワークコールが失敗します。呼び出しはHTTPでは正常に機能しますが、HTTPSでは失敗します。
ここにログがあります、
Java.net.ProtocolException: Expected ':status' header not present
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.Http2xStream.readHttp2HeadersList(Http2xStream.Java:262)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.Http2xStream.readResponseHeaders(Http2xStream.Java:145)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.Java:53)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.Java:92)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.Java:67)
10-18 14:59:01.103 30746-30746/? W/System.err: at codmob.com.campuswallet.app.ApiClient$1.intercept(ApiClient.Java:66)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.Java:92)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.Java:45)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.Java:92)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.Java:67)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.Java:109)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.Java:92)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.Java:67)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.Java:93)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.Java:92)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.Java:124)
10-18 14:59:01.103 30746-30746/? W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.Java:92)
10-18 14:59:01.104 30746-30746/? W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.Java:67)
10-18 14:59:01.104 30746-30746/? W/System.err: at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.Java:170)
10-18 14:59:01.104 30746-30746/? W/System.err: at okhttp3.RealCall.access$100(RealCall.Java:33)
10-18 14:59:01.104 30746-30746/? W/System.err: at okhttp3.RealCall$AsyncCall.execute(RealCall.Java:120)
10-18 14:59:01.104 30746-30746/? W/System.err: at okhttp3.internal.NamedRunnable.run(NamedRunnable.Java:32)
10-18 14:59:01.104 30746-30746/? W/System.err: at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1133)
10-18 14:59:01.104 30746-30746/? W/System.err: at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:607)
10-18 14:59:01.104 30746-30746/? W/System.err: at Java.lang.Thread.run(Thread.Java:761)
数時間の混乱の後、最終的に解決策を得ました。 RetrofitおよびOkhttp3ライブラリを最新バージョンに更新すると、私にとってはうまくいきました。
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
今日も同じ問題に直面しました。その理由は、サーバー上のnginxを最新バージョン(1.13.6)に更新することにありました。サーバー上のnginxを更新していない場合は、バックエンドチームに問い合わせてください。
nginx changelog- http://nginx.org/en/CHANGES
使っています OkHttp2
(2.7.5)そして、クライアントにHTTP 1.1
プロトコル
OkHttpClient client = new OkHttpClient();
client.setProtocols(Arrays.asList(Protocol.HTTP_1_1)); // <- add this line
私はokhttp3(okhttp-3.4.1)を使用していますが、okhttp3はHTTP_1.1プロトコルとの互換性があまりないため、手動で追加する必要があります。あなたは見ることができます 公式リンク
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//protocols
List<Protocol> protocols = new ArrayList<Protocol>();
protocols.add(Protocol.HTTP_1_1);
protocols.add(Protocol.HTTP_2);
builder.protocols(protocols);