2015-11-19 15 views
22

Ich verwende Retrofit 2.0, um API-Aufrufe zu erstellen, die Observables zurückgeben. Es funktioniert alles gut, wenn der Anruf ordnungsgemäß ausgeführt wurde und die Antwort wie erwartet ist. Nehmen wir an, wir haben eine Fehlerreaktion, es löst einen onError aus. Ich möchte den Antworttext lesen, auch wenn es ein Fehler ist.Wie bekomme ich Response-Nachricht, wenn bei der Verwendung von Retrofit 2.0 Observables ein Fehler auftritt

Beispiel

@FormUrlEncoded 
@POST("tokenLogin") 
Observable<LoginResponse> loginWithToken(
     @Field("token") String pin 
); 

Wenn die Anfrage und Antwort gültig sind, erhalte ich die richtige beobachtbar und onError wie erwartet wird aufgerufen, wenn ein Fehler ist.

Richtige Antwort:

{ "status" : "authenticated" } 

Die beobachtbare wandelt diese in die rechten beobachtbare und ich kann die Antwort als Objekt Login lesen.

Nun ist die Fehlerreaktion wie folgt:

{ "errorMessage" : "You need to take some xyz action" } 

Ich möchte, dass die Fehlerantwort lesen und die Nachricht an den Benutzer anzuzeigen. Wie gehe ich vor?

Antwort

36

Genau prüfen, ob die throwable eine Instanz von Httpexception ist und dann können Sie die Nachrüst-Antwort Zugang

if (e instanceof HttpException) { 
    ResponseBody body = ((HttpException) e).response().errorBody(); 
    ... 
} 

Dann Sie die converter to deserialize it (oder do it yourself) verwenden können.

9

Sie können diesen Codeblock hinzufügen, um die Fehlermeldung anzuzeigen.

@Override 
public void onFailure(Throwable t) { 

if (t instanceof HttpException) { 
     ResponseBody body = ((HttpException) t).response().errorBody(); 
     Gson gson = new Gson(); 
     TypeAdapter<ErrorParser> adapter = gson.getAdapter 
       (ErrorParser 
         .class); 
     try { 
      ErrorParser errorParser = 
        adapter.fromJson(body.string()); 

      Logger.i(TAG, "Error:" + errorParser.getError()); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
Verwandte Themen