2015-11-19 16 views
22

Sto utilizzando Retrofit 2.0 per effettuare chiamate API che restituiscono oggetti osservabili. Funziona tutto bene quando la chiamata è andata bene e la risposta è come previsto. Ora diciamo che abbiamo una risposta all'errore, genera un'eccezione. Vorrei leggere il corpo della risposta anche quando si tratta di un errore.Come ottengo il corpo della risposta quando si verifica un errore durante l'utilizzo delle osservazioni osservative Retrofit 2.0

Esempio

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

Quando la richiesta e la risposta sono validi, ottengo il diritto osservabile e onError viene chiamato come previsto quando si verifica un errore.

risposta corretta:

{ "status" : "authenticated" } 

I convertiti osservabili questo nel giusto osservabile e posso leggere la risposta come oggetto LoginResponse.

Ora, la risposta di errore è la seguente:

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

vorrei leggere che la risposta di errore e visualizzare il messaggio per l'utente. Come faccio a farlo?

risposta

36

Basta controllare se il throwable è un'istanza di HttpException e poi si può accedere alla risposta retrofit

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

quindi è possibile utilizzare il converter to deserialize it (o fai da te).

9

È possibile aggiungere questo blocco di codice per visualizzare il messaggio di errore.

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