2015-11-19 1 views
22

J'utilise Retrofit 2.0 pour effectuer des appels api renvoyant des Observables. Tout fonctionne bien lorsque l'appel s'est bien passé et la réponse est comme prévu. Maintenant, disons que nous avons une réponse d'erreur, il lance un onError. Je voudrais lire le corps de la réponse même s'il s'agit d'une erreur.Comment obtenir le corps de la réponse en cas d'erreur lors de l'utilisation de Retrofit 2.0 Observables

Exemple

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

Lorsque la demande et la réponse sont valables, je reçois le droit observable et onError est appelé comme prévu quand il y a une erreur.

Réponse correcte:

{ "status" : "authenticated" } 

Les convertis Observable dans ce droit Observable et je peux lire la réponse comme objet LoginResponse.

Maintenant, la réponse d'erreur est la suivante:

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

Je voudrais lire cette réponse d'erreur et afficher le message à l'utilisateur. Comment vais-je faire cela?

Répondre

36

juste vérifier si le throwable est une instance de HttpException et vous pouvez accéder à la réponse de rénovation

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

Ensuite, vous pouvez utiliser le converter to deserialize it (ou le faire vous-même).

9

Vous pouvez ajouter ce bloc de code pour afficher le message d'erreur.

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