2015-10-14 1 views
0

Pendant quelques mois, mon application fonctionnait bien, mais dans quelques semaines, je reçois cette erreur parfois lorsque je fais des demandes séquentielles. Je n'ai rien mis à jour dans mon application. iOS version hors application n'a pas de problème mais je reçois parfois cette erreur surtout dans mes demandes de première fois.Retrofit + OkHttp Ligne d'état inattendu <! DOCType html>

02-05 04:45:14.017 15972-16249/com.myapp.android D/Retrofit﹕ java.net.ProtocolException: Unexpected status line: <!DOCType html> 
      at com.squareup.okhttp.internal.http.StatusLine.parse(StatusLine.java:73) 
      at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:187) 
      at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80) 
      at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:791) 
      at com.squareup.okhttp.internal.http.HttpEngine.access$200(HttpEngine.java:90) 
      at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:784) 
      at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:645) 
      at com.squareup.okhttp.Call.getResponse(Call.java:263) 
      at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:219) 
      at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:192) 
      at com.squareup.okhttp.Call.execute(Call.java:79) 
      at retrofit.client.OkClient.execute(OkClient.java:53) 
      at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326) 
      at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220) 
      at retrofit.RestAdapter$RestHandler$1.invoke(RestAdapter.java:265) 
      at retrofit.RxSupport$2.run(RxSupport.java:55) 
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
      at retrofit.Platform$Android$2$1.run(Platform.java:142) 
      at java.lang.Thread.run(Thread.java:841) 
02-05 04:45:14.017 15972-16249/com.myapp.android D/Retrofit﹕ ---- END ERROR 
+0

Il ne s'agit pas d'un problème de conversion, votre API renvoie un code HTML au lieu de JSON/XML, peu importe ce que vous attendez. Ce que je suggère si vous essayez de faire la même demande dans un client de repos de navigateur et voir la réponse. Vous devez déboguer et trouver l'adresse exacte et le champ/requête/en-tête passés en rattrapage. – Milan

Répondre

1

Cette erreur est due à un problème de réutilisation de la connexion. Connaissez-vous le code de réponse et les en-têtes de la réponse précédente? OkHttp interprète cela comme n'ayant aucun corps, et le serveur n'est pas d'accord.

+0

En-tête de réponse précédente est 401. peut-il causer le problème? – savepopulation

+0

En fait j'ai eu le problème je pense. J'ai un appel de fond et je l'appelle environ 3-4 fois en arrière-plan et sa réponse est 401. Lorsque je ferme cet appel api je ne reçois pas cette erreur. c'est possible? @JesseWilson – savepopulation

+0

Avez-vous trouvé une solution pour cette @savepopulation? Même moi j'ai le même problème. La réponse est bonne quand DefaultHttpClient est utilisé mais, quand j'essaye avec OkHttp, il lance un peu de DOCTYPE en réponse. – arnp

0

Réglage de la valeur d'en-tête,

@Headers("Connection:close") 

a fonctionné pour moi.

+0

Oui c'est une solution mais je ne suis pas sûr de savoir si c'est bon à utiliser. Je pense que le côté serveur devrait décider de fermer ou de reprendre la connexion. – savepopulation