如何处理登录活动中API的错误(Android Studio中的模板)

问题描述 投票:0回答:1

我正在使用Retrofit2实现对端点的简单登录。当用户凭据正确时,一切正常,但是当我尝试输入无效数据时,一切就中断了。当找不到用户但我找不到解决方法时,我正在尝试处理错误。错误响应如下:

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

尽管有错误,此响应的状态仍为200。

应用程序在LoginRepository中由于NPE崩溃,我试图将用户数据保存到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作为转换器

我使用的登录活动示例可以找到here

更新:

使用有效凭据成功登录:

enter image description here

android authentication retrofit sample
1个回答
0
投票
    @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();
            }
        });
© www.soinside.com 2019 - 2024. All rights reserved.