2015-11-19 15 views
22

Używam Retrofit 2.0 do wykonywania wywołań API, które zwracają Observables. Wszystko działa dobrze, gdy połączenie zostało przerwane, a odpowiedź jest zgodna z oczekiwaniami. Teraz powiedzmy, że mamy odpowiedź błędu, rzuca on onError. Chciałbym przeczytać treść odpowiedzi, nawet jeśli jest to błąd.Jak uzyskać treść odpowiedzi w przypadku wystąpienia błędu podczas korzystania z Retrofit 2.0 Observables

Przykład

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

Gdy żądanie i odpowiedź są ważne, mam prawo do zaobserwowania i onError jest nazywany zgodnie z oczekiwaniami, gdy wystąpi błąd.

Poprawne odpowiedzi:

{ "status" : "authenticated" } 

obserwowalnym konwertuje do prawej Obserwowalne i mogę odczytać odpowiedź jako obiekt LoginResponse.

Teraz odpowiedź Błąd jest następujący:

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

chciałbym przeczytać, że odpowiedź błędu i wyświetli komunikat dla użytkownika. Jak mam to zrobić?

Odpowiedz

36

Wystarczy sprawdzić, czy Throwable jest instancją HttpException a następnie można uzyskać dostęp do odpowiedzi modernizacji

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

Następnie możesz użyć tych converter to deserialize it (lub zrób to sam).

9

Możesz dodać ten blok kodu, aby wyświetlić komunikat o błędzie.

@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(); 
     } 
    } 
} 
Powiązane problemy