web-dev-qa-db-fra.com

Retrofit 2 + Erreur de traitement Rxjava

Je reçois donc déjà un jeton du Json lorsque la connexion est établie sans problème et reçois le hachage

Mais lorsque la réponse du serveur est une erreur, je ne peux pas obtenir le message Json ({message: "Erreur: mauvais email}" car, dans onError, nous n'obtenons comme argument qu'un Throwable et pas une classe modèle comme dans

comment puis-je obtenir un message JSON du serveur onError?

final Observable<TokenResponse> observable = Service.login(userCredentials);
    observable.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<TokenResponse>() {
                String error="";

                @Override
                public void onCompleted() {
                    mLoginView.whenLoginSucess();
                }

                @Override
                public void onError(Throwable e) {

                    if (e instanceof HttpException) {
                        HttpException exception = (HttpException) e;
                        Response response = exception.response();
                        Converter<ResponseBody, ErrorFromServer> converter = new GsonConverterFactory()
                                .responseBodyConverter(ErrorFromServer.class, Annotation[0]);
                        ErrorFromServer error = converter.convert(response.errorBody());
                    }

                    mLoginView.errorText(error);

                    e.printStackTrace();

                }

                @Override
                public void onNext(TokenResponse tokenResponse) {


                    SharedPreferences.Editor editor = sharedP.edit();
                    editor.putString("hash", tokenResponse.getToken());
                    editor.commit();

                    //getString return key value "hash" if there is no value, returns null
                    hash = sharedP.getString("hash",null);




                }
            });

Code TokenResponse

public class TokenResponse {
@SerializedName("hash")
@Expose
private String token;

@SerializedName("message")
@Expose
private String message;


public String getMessage() {return message;}


public String getToken() {
    return token;
}

}

7
Diogo Rosa

J'ai trouvé une solution, j'ai une classe d'application qui crée une modification, puis je viens de créer un ResponseBody et de le convertir à l'aide de responseBodyConverter (, )

                @Override
                public void onError(Throwable e) {
                    if (e instanceof HttpException) {
                        ResponseBody body = ((HttpException) e).response().errorBody();

                        Converter<ResponseBody, Error> errorConverter =
                            application.getRetrofit().responseBodyConverter(Error.class, new Annotation[0]);
                    // Convert the error body into our Error type.
                        try {
                            Error error = errorConverter.convert(body);
                            Log.i("","ERROR: " + error.message);
                            mLoginView.errorText(error.message);
                        } catch (IOException e1) {
                        e1.printStackTrace();
                        }
                     }



                static class Error{
                String message;
                }

le JSon a reçu était {"erreur": 4041, "message": "Email introuvable"} c'est pourquoi la classe Error, je viens de créer un message variable parce que je veux juste montrer le message à l'utilisateur

8
Diogo Rosa

Vous mélangez une erreur logique (la connexion a échoué pour une raison quelconque) et une erreur d'application. Si votre serveur envoie une réponse avec HTTP 200 et un json valide en cas d'échec de la connexion, votre application n'appelle pas du tout onError.

Donc, en gros, vous devez vérifier la réponse (réussie) du serveur et décider en fonction du JSON fourni si la connexion a réussi ou non.

onError doit être appelé, par exemple, dans le cas où le serveur n'est pas accessible ou ne parvient pas à fournir une réponse valide.

Edit: Je ne sais pas ce que contient votre TokenResponse mais la réponse pour un login doit être la même, peu importe si le résultat a été positif ou non. Il vous suffit ensuite de vérifier la réponse TokenResponse pour savoir si le résultat contient des erreurs ou non.

Cochez cette réponse à titre d'exemple: https://stackoverflow.com/a/31159671/180538

2
WarrenFaith