2016-07-06 5 views
0

Ich habe die HTTP-Bibliothek von Apache auf OkHttp3 in der Android-App meines Unternehmens umgestellt.java.net.ProtocolException: Unerwartete Statuszeile: {} HTTP/1.1 422 Unprocessable Entity

Der okHttp-Client wird auf folgende Weise einstellen:

mDefaultClient = new OkHttpClient.Builder() 
       .readTimeout(getSocketTimeOut(), TimeUnit.MILLISECONDS) 
       .writeTimeout(getSocketTimeOut(), TimeUnit.MILLISECONDS) 
       .connectTimeout(getSocketTimeOut(), TimeUnit.MILLISECONDS) 
       .followRedirects(true) 
       .connectionPool(new ConnectionPool(MAX_TOTAL_CONNECTION, 5, TimeUnit.MINUTES)) 
       .addNetworkInterceptor(new StethoInterceptor()) 
       .followSslRedirects(true) 
       .build(); 

Wenn die Verbindung zum Keep-Alive gesetzt ist (Standardeinstellung), scheitern einige Anfragen mit den folgenden Java Ausnahmen:

java.net.ProtocolException: Unexpected status line: {}HTTP/1.1 422 Unprocessable Entity 

java.net.ProtocolException: Unexpected status line: {}HTTP/1.1 200 OK 

Diese Anfragen schlagen immer mit dieser Ausnahme fehl, wenn die Anfrage direkt vor einer 304 Not Modified Antwort mit einem leeren Text erscheint.

Ohne diese 304 Antwort werden diese Anforderungen erfolgreich verarbeitet.

Ich habe überall gelesen, dass die Lösung ist, den Connection Closed-Header Anforderungen hinzuzufügen.

Allerdings möchte ich das nicht tun. Der Verbindungspool, den wir verwenden möchten, wird nahezu unbrauchbar gemacht.

Die Verbindung aufrecht zu erhalten, war ein Vorteil, den wir mit Apache hatten und wir möchten den gleichen Nutzen mit OkHttp behalten.

Der Server scheint keine Fehlerantwort zu senden, wie durch Senden von Postman-Anfragen an den Server bestätigt, die nicht fehlschlagen. Auch unser vorheriger Apache-Client hat diese Anfragen korrekt bearbeitet.

Das Hinzufügen eines Interceptors (Netzwerk oder nicht) scheint nicht zu funktionieren. Ich habe versucht, den Body zu füllen oder 'Content-Length' für die 304-Anfrage auf 0 zu setzen, aber die nächste Anfrage ist immer fehlgeschlagen.

Was sind meine Optionen?

+0

Dann ist entweder die vorherige 304-Antwort fehlerhaft oder Ihre Bibliothek verarbeitet sie falsch. Hast du eine Spur? –

Antwort

0

Ihr Webserver gibt Antwortdaten mit einer HTTP 304-Antwort falsch zurück. Bring sie dazu, das zu beheben.

Während Sie darauf warten, können Sie mit einem OkHttp umgehen network interceptor, die einen Connection: close Kopf an die Antwort-Header für alle HTTP-304s erstellt.