Как обрабатывать ошибки API при входе в систему (шаблон из Android Studio) - PullRequest
1 голос
/ 09 мая 2020

Я реализую простой вход в конечные точки с помощью Retrofit2. Все работает нормально, когда учетные данные пользователя верны, но ломаются, когда я пытаюсь ввести недопустимые данные. Я пытаюсь исправить ошибки, когда пользователь не найден, но я не могу найти способ сделать это. Ответ об ошибке выглядит так:

{
    "0": [
        "erreur",
        "statut"
    ],
    "erreur": "Erreur, connexion echoue.",
    "statut": "KO"
}

Этот ответ имеет статус 200, несмотря на то, что он является ошибкой.

Приложение выдает сбой с NPE в LoginRepository, где я пытаюсь сохранить данные пользователя в SharedPreferences, потому что результат ошибки не обрабатывается, поэтому любой ответ приложения считается успешным.

Образец предоставляет класс Result, который, похоже, не работает для моего варианта использования, потому что ответ всегда успешен:

   public class Result<T> {
    // hide the private constructor to limit subclass types (Success, Error)
    private Result() {
    }

    @Override
    public String toString() {
        if (this instanceof Result.Success) {
            Result.Success success = (Result.Success) this;
            return "Success[data=" + success.getData().toString() + "]";
        } else if (this instanceof Result.Error) {
            Result.Error error = (Result.Error) this;
            return "Error[exception=" + error.getError().toString() + "]";
        }
        return "";
    }

    // Success sub-class
    public final static class Success<T> extends Result {
        private T data;

        public Success(T data) {
            this.data = data;
        }
        public T getData() {
            return this.data;
        }
    }

    // Error sub-class
    public final static class Error extends Result {
        private Exception error;


        public Error(Exception error) {
            this.error = error;
        }

        public Exception getError() {
            return this.error;
        }

    }
}

А вот как я обрабатываю логин в LoginRepository:

public Result<LoggedInUser> login(String username, String password) {
    // handle login
    Result<LoggedInUser> result = dataSource.login(username, password);
    if (result instanceof Result.Success) {
        setLoggedInUser(((Result.Success<LoggedInUser>) result).getData());
    }

    return result;
}

Примечание: у меня нет доступа к серверу. Я использую Gson в качестве конвертера.

Образец активности входа, который я использовал, можно найти здесь

ОБНОВЛЕНИЕ:

Успешный вход с действительными учетными данными:

enter image description here

1 Ответ

1 голос
/ 10 мая 2020

Отметьте этот ответ, он вам поможет.

  @POST("end_path")
      Call<ResponseBody> LoginCall(
        @Field("email") String user_id,
        @Part("paassword") String language
      );

     Call<ResponseBody> call = Constant.service.LoginCall(
                "email", "pass");
        call.enqueue(new retrofit2.Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, 
               Response<ResponseBody> response) {
                if (response.isSuccessful()) {
                    try {
                        String responseData = response.body().string();
                        JSONObject object = new JSONObject(responseData);

                   if(object.getString("statut").equalsIgnoreCase("success")){
                            LoggedInUser successData = new 
                            Gson().fromJson(responseData, LoggedInUser.class);
                            }else{
                   showToast("Email password incorrect");//or show you want 
                       this message.
                                }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (JsonSyntaxException e) {
                        e.printStackTrace();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                } else {
                    showToast("something_went_wrong");
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                t.printStackTrace();
            }
        });
...