2014-04-23 5 views
5

Meine Android-App ist mit dem folgenden Stack-Trace abgestürzt, aber wenn ich es von einem Desktop-Rest-Client aus versuche, funktioniert es gut. Weiß jemand, was das Problem sein könnte?Retrofit "java.net.ProtocolException: Unerwartete Statuszeile", Jeder?

04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ ---> HTTP GET http://beta2.irealtor.api.iproperty.com.my/Listing?pageSize=10000&orderby=1&order=-1 
04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ If-Modified-Since: 1398235278243 
04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ User-Agent: Android/0.0.20 
04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ Accept: application/json 
04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ Authorization: WFdSeW8vOTJ1Z3BoQlBJMk53VGpaekZRY2pCd1pYSlVXUT090 
04-23 16:00:50.449 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ ---> END HTTP (0-byte body) 
04-23 16:00:50.549 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ ---- ERROR http://beta2.irealtor.api.iproperty.com.my/Listing?pageSize=10000&orderby=1&order=-1 
04-23 16:00:50.549 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ java.net.ProtocolException: Unexpected status line: {"Data":[],"CustomStatusCode":200,"Status":"success"}HTTP/1.1 200 OK 
      at com.squareup.okhttp.internal.http.StatusLine.<init>(StatusLine.java:38) 
      at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:150) 
      at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:99) 
      at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:595) 
      at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:381) 
      at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:328) 
      at com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:493) 
      at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:71) 
      at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38) 
      at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:358) 
      at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:284) 
      at $Proxy0.syncProperties(Native Method) 
      at com.iproperty.android.apps.irealtor.sync.SyncHelper.performSync(SyncHelper.java:210) 
      at com.iproperty.android.apps.irealtor.sync.SyncAdapter.onPerformSync(SyncAdapter.java:82) 
      at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:259) 
04-23 16:00:50.549 27917-27983/com.iproperty.android.apps.irealtor D/Ireal_IrealtorClient﹕ ---- END ERROR 


/**Sample code by using BasicHttpClient*/ 
BasicHttpClient httpClientTest = new BasicHttpClient(); 
httpClientTest.addHeader("If-Modified-Since", "1398312582192"); 
httpClientTest.addHeader("Authorization", "WFdSeW8vOTJ1Z3BoQlBJMk53VGpaekZRY2pCd1pYSlVXUT090"); 
httpClientTest.addHeader("User-Agent", "Android/0.0.20"); 
httpClientTest.addHeader("Accept", "application/json"); 

HttpResponse responseTest = httpClientTest.get("http://beta2.irealtor.api.iproperty.com.my/Listing?pageSize=100&orderby=1&order=-1",null); 
final int statusTest = responseTest.getStatus(); // here i get 204, because i make server return 204 then there is nothing. 
String body responseTest.getAsString() // here i get empty which is correct. 
+0

Was ist Ihre Frage? –

+0

Hallo @GeraldSchneider, ich habe die Frage bearbeitet. –

+0

Sie vermissen die Authentifizierung auf Ihre Anfrage. –

Antwort

2

Etwas verursacht Probleme bei der Reaktion Körperlänge der vorhergehenden HTTP-Anforderung, und das verursacht die gepoolte Verbindung beschädigt werden.

wurde die vorhergehende Anfrage von OkHttp interpretierte keinen Körper haben, aber es hat diesen Körper:

{"Data":[],"CustomStatusCode":200,"Status":"success"} 

Es ist wahrscheinlich entweder um einen Fehler in dem Server oder ein Fehler in OkHttp, auf dem Kopf- und Code abhängig wurde von der vorhergehenden URL gesendet. Wenn Sie die Anforderung einfügen können, die diesem Fehler vorausgeht, können wir herausfinden, wessen Fehler es ist!

+0

gemacht Wird es möglich sein, den Antwort-Cache zu verursachen? Jetzt setzt das Endpoint-Handbuch den httpstatus auf 204, wenn die Länge von Data [] 0 ist. –

+0

Deaktivieren Sie den Antwortcache und versuchen Sie, ihn zu reproduzieren! Meine Vermutung ist, dass es der Verbindungspool ist. –

+0

Verbindungspool? Ich deaktiviere den Cache mit okHttpClient.setResponseCache (null); okHttpClient.setOkResponseCache (null); –

7

Auch erhalten diese Antwort Fehler beim Senden von zwei POST-Anfragen in schneller Folge. Die Lösung besteht darin, den Header "Verbindung: Schließen" für beide Anfragen hinzuzufügen.

8

Ich füge einen Netzwerk-Interceptor hinzu und füge den Close-Connection-Header dazu für den okhttp3-Client hinzu.

okHttpClient = new OkHttpClient.Builder() 
       .addNetworkInterceptor(new Interceptor() { 
        @Override 
        public Response intercept(Chain chain) throws IOException { 
         Request request = chain.request().newBuilder().addHeader("Connection", "close").build(); 
         return chain.proceed(request); 
        } 
       }) 
       .build(); 

Und das lösen das Problem. Hoffe es hilft!

+0

Dies sollte als Antwort akzeptiert werden. Danke für das Posten dieses – Raizal

+0

Das funktionierte für mich! –

3

Sie können dies beheben, indem Sie den Header-Wert @Headers("Connection:close") auf Ihre Nachrüstmethode einstellen.
Das funktionierte für mich.