2016-05-25 6 views
1

Meine Frage ist so ähnlich wie Retrofit 2.0 beta 4 response get IllegalArgumentException, aber ihre Antwort hat mir nicht geholfen.java.lang.IllegalArgumentException: 'retrofit2.Response' ist kein gültiger Antworttexttyp. Meintest du ResponseBody?

Ich migriere von Retrofit 1.9 zu 2.0.2. Ich registriere meine App für Messaging nach dem Start.

/** 
    * Synchronous method to register GCM Token on Backend Server 
    * 
    * @return true, in case of success response, false otherwise. 
    */ 
    public boolean registerGCMToken() 
    { 
     ... 

     try 
     { 
      Call<Response> call = mService.registerGCMToken(sessionId, this.ADDITIONAL_QUERY); 
      final Response response = call.execute().body(); // <<< Error points here 
      final DefaultResponse defaultResponse = DefaultResponse.newInstance(response); 
      return defaultResponse.isSuccess(); 
     } 
     catch (IOException ignored) 
     { 

     } 

     return false; 
    } 

Meine Schnittstelle wie folgt aussieht:

@GET("my/url") 
    Call<Response> registerGCMToken(@Header(Constant.HEADER_WILDCARD) String accessToken, 
        @QueryMap Map<String, String> additionalQuery); 

Sobald ich starten Sie die App ich diesen Fehler:

java.lang.IllegalArgumentException: 'retrofit2.Response' is not a valid response body type. Did you mean ResponseBody?

und verweist auf die Linie, die ich oben erwähnt.

Meine newInstance Methode wie folgt aussieht:

public static final DefaultResponse newInstance(final Response response) 
    { 
     final DefaultResponse defaultResponse = new DefaultResponse(); 
     if (response != null) 
     { 
      defaultResponse.status = response.code(); 
     } 

     return defaultResponse; 
    } 

So wie Sie sehen, muss ich wissen, was der Code HTTP-Status ist. Durch die Änderung Response generische zu ResponseBody Ich bin nicht in der Lage, http Statuscode zu bekommen. Also, Was ist deine Empfehlung? Dank

Antwort

4

Was ich habe, während die von Ihnen vorgeschlagenen Antworten von der Post zu lesen, statt dessen ist, dass:

@GET("my/url") 
    Call<Response> registerGCMToken(@Header(Constant.HEADER_WILDCARD) String accessToken, 
        @QueryMap Map<String, String> additionalQuery); 

Versuchen:

@GET("my/url") 
    Call<ResponseBody> registerGCMToken(@Header(Constant.HEADER_WILDCARD) String accessToken, 
        @QueryMap Map<String, String> additionalQuery); 

Weil Sie Response und nicht die Antwort hier bekommen:

 final Response response = call.execute().body(); 

Wie er tat: How can I handle empty response body with Retrofit 2?

+0

Dank Sharad habe ich das tatsächlich getestet und das Problem ist, dass ich HTTP-Statuscode von ResponseBody nicht bekommen kann. Allerdings, wenn ich die API aufrufen, hat seine Schnittstelle eine Methode, öffentliche void onResponse (Anruf Anruf, Antwort Antwort) {...}, dass ich in der Lage bin, Statuscode von "Antwort" zu bekommen. Das verwirrt mich, wie kann ich die Antwort auf synchrone Weise bekommen. – Hesam

+0

@Hesam Ich habe nicht viel Ahnung davon, und natürlich nicht mehr als du. Sie können es für synchrone Weise prüfen: http://stackoverflow.com/questions/36425488/how-to-get-http-response-status-in-synchronous-retrofit-2 und dies für HTTP-Code: http: // stackoverflow.com/questions/33774940/get-response-status-code-using-retrofit-2-0-and-rxjava –

+0

Dank bro, auf asynchrone Weise habe ich kein Problem, um es als Response-Klasse funktioniert gut, das gleiche wie Ihre Dokumente – Hesam

Verwandte Themen