web-dev-qa-db-fra.com

Comment obtenir le corps de réponse en cas d'erreur lors de l'utilisation de Retrofit 2.0 Observables

J'utilise Retrofit 2.0 pour effectuer des appels API qui renvoient Observables. Tout fonctionne bien lorsque l'appel s'est bien passé et que la réponse est conforme aux attentes. Supposons maintenant que nous ayons une réponse d'erreur, elle lance une onError. Je voudrais lire le corps de la réponse même s'il s'agit d'une erreur.

Exemple

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

Lorsque la demande et la réponse sont valides, j'obtiens le bon observable et onError est appelé comme prévu en cas d'erreur.

Réponse correcte:

{ "status" : "authenticated" }

L'observable le convertit en l'observable de droite et je peux lire la réponse en tant qu'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 dois-je procéder?

29
achie

Vérifiez simplement si le jetable est une instance de HttpException et vous pourrez alors accéder à la réponse de modification

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

Ensuite, vous pouvez utiliser le convertisseur pour le désérialiser (ou le faire vous-même).

45
Tim C

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();
        }
    }
}
11
Akshay Shinde