2014-04-23 9 views
5

La mia app Android si è arrestata in modo anomalo con la seguente traccia di stack, ma quando provo da un client di ripristino desktop funziona correttamente. Qualcuno sa quale potrebbe essere il problema?Retrofit "java.net.ProtocolException: riga di stato imprevista", Chiunque?

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

qual è la tua domanda? –

+0

Ciao @GeraldSchneider, ho modificato la domanda. –

+0

Manca l'autenticazione per la richiesta. –

risposta

2

Qualcosa causando problemi con la lunghezza del corpo della risposta della richiesta HTTP precedente, e che sta causando la connessione pool venga danneggiato.

La richiesta precedente è stato interpretato da OkHttp avere nessun corpo, ma ha questo corpo:

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

è probabilmente sia un bug nel server o un bug nel OkHttp, a seconda di quale le intestazioni e il codice è stato inviato dall'URL precedente. Se riesci a incollare la richiesta che precede questo errore, possiamo capire di chi è la colpa!

+0

È possibile causare la cache di risposta? ora il manuale dell'endpoint imposta httpstatus su 204 quando la lunghezza di Data [] è 0. –

+0

Disattiva la cache di risposta e prova a riprodurla! La mia ipotesi è che sia il pool di connessioni. –

+0

Pool di connessione? disattivo la cache usando okHttpClient.setResponseCache (null); okHttpClient.setOkResponseCache (null); –

7

Anche ottenere questo errore di risposta quando si inviano due richieste POST in rapida successione. La soluzione è aggiungere l'intestazione "Connection: close" per entrambe le richieste.

8

aggiungere un intercettore di rete e aggiungere l'intestazione di connessione chiusa ad esso per il client okhttp3.

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

E che risolvono il problema. Spero che aiuti!

+0

questo dovrebbe essere accettato come risposta. grazie per aver postato questo – Raizal

+0

Questo ha funzionato per me! –

3

È possibile risolvere questo problema impostando il valore dell'intestazione @Headers("Connection:close") sul metodo di retrofit.
Questo ha funzionato per me.