tag studio que android retrofit retrofit2 okhttp3 protocolexception

android - studio - ProtocolException: Se esperaba que el encabezado '': status'' no estuviera presente



object tag android (4)

Después de horas de lío, finalmente consiguió una solución. Actualizar las bibliotecas Retrofit y Okhttp3 a la última versión me sirvió de mucho.

compile ''com.squareup.okhttp3:okhttp:3.9.0'' compile ''com.squareup.retrofit2:retrofit:2.3.0''

Las llamadas de red de actualización fallan repentinamente con una excepción de protocolo en una aplicación que funciona. La aplicación estuvo funcionando hasta ayer y hoy todas las llamadas de red fallan. Las llamadas funcionan bien con HTTP pero fallan con HTTPS.

Aquí están los registros,

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)


Estoy usando OkHttp2 ( OkHttp2 ) y resolví este problema forzando al cliente a usar el protocolo HTTP 1.1

OkHttpClient client = new OkHttpClient(); client.setProtocols(Arrays.asList(Protocol.HTTP_1_1)); // <- add this line


Estoy usando okhttp3 (okhttp-3.4.1), okhttp3 no es muy compatible con el protocolo HTTP_1.1 y se debe agregar manualmente. Puedes ver el enlace oficial

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);


Hoy enfrentamos el mismo problema. El motivo fue actualizar nginx en el servidor a la última versión (1.13.6). Pregunte a su equipo de back-end si no actualizaron nginx en el servidor.

nginx changelog - http://nginx.org/en/CHANGES