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

如何处理登录活动中API的错误(来自Android Studio的模板),android,authentication,retrofit,sample,Android,Authentication,Retrofit,Sample,我正在使用Reformation2实现对端点的简单登录。当用户凭据正确时,一切正常,但当我尝试输入无效数据时,一切都会中断。 我试图在找不到用户时处理错误,但我找不到这样做的方法。 错误响应如下所示: { "0": [ "erreur", "statut" ], "erreur": "Erreur, connexion echoue.", "statut": "KO" } 尽管存在错误,但此响应的状态为200 应用程序在Login

我正在使用Reformation2实现对端点的简单登录。当用户凭据正确时,一切正常,但当我尝试输入无效数据时,一切都会中断。 我试图在找不到用户时处理错误,但我找不到这样做的方法。 错误响应如下所示:

{
    "0": [
        "erreur",
        "statut"
    ],
    "erreur": "Erreur, connexion echoue.",
    "statut": "KO"
}
尽管存在错误,但此响应的状态为200

应用程序在LoginRepository中与NPE崩溃,我正在尝试将用户数据保存到SharedReferences,因为未处理错误结果,因此应用程序威胁任何响应都将成功

该示例提供的结果类似乎不适用于我的用例,因为响应总是成功的:

   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;
        }

    }
}
公共类结果{
//隐藏私有构造函数以限制子类类型(成功、错误)
私人结果(){
}
@凌驾
公共字符串toString(){
if(Result.Success的此实例){
Result.Success成功=(Result.Success)这个;
返回“Success[data=“+Success.getData().toString()+””;
}else if(Result.Error的此实例){
Result.Error Error=(Result.Error)this;
返回“Error[exception=“+Error.getError().toString()+””;
}
返回“”;
}
//成功子类
公共最终静态类成功扩展结果{
私有T数据;
公众成功(T数据){
这个数据=数据;
}
公共T getData(){
返回此.data;
}
}
//错误子类
公共最终静态类错误扩展结果{
私有异常错误;
公共错误(异常错误){
this.error=错误;
}
公共异常getError(){
返回这个错误;
}
}
}
下面是我如何处理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;
}
公共结果登录(字符串用户名、字符串密码){
//处理登录
结果=dataSource.login(用户名、密码);
if(result.Success的结果实例){
setLoggedInUser(((Result.Success)Result.getData());
}
返回结果;
}
注意:我没有访问服务器的权限。我使用Gson作为转换器

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

更新:

使用有效凭据成功登录:

检查这个答案,它将帮助你

@POST(“结束路径”)
呼叫登录呼叫(
@字段(“电子邮件”)字符串用户id,
@部分(“paassword”)字符串语言
);
Call Call=Constant.service.LoginCall(
“电子邮件”、“通行证”);
call.enqueue(新的2.Callback(){
@凌驾
公共void onResponse(调用,
回应(回应){
if(response.issusccessful()){
试一试{
字符串responseData=response.body().String();
JSONObject对象=新的JSONObject(responseData);
if(object.getString(“statut”).equalsIgnoreCase(“success”)){
LoggedInUser successData=new
Gson().fromJson(responseData,LoggedInUser.class);
}否则{
showtoos(“电子邮件密码不正确”);//或显示您想要的
这条消息。
}
}捕获(IOE异常){
e、 printStackTrace();
}捕获(JsonSyntaxException e){
e、 printStackTrace();
}捕获(JSONException e){
e、 printStackTrace();
}
}否则{
showtoos(“出了什么问题”);
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
t、 printStackTrace();
}
});

我认为这将从后端修复,或者将您的Loggedinuser模型更改为响应库。还要检查这个回答他们正在手动处理JSON解析吗?我使用的是Gson,LoggedInUser是响应主体,当用户凭据正确时我可以登录。是的,根据响应,因为您的响应是成功和失败时的更改。问题是服务器总是返回200这是一个有效响应。您可以共享您的登录成功响应,以便我可以轻松理解此场景吗?并从后端更改响应。我想你每次都会得到这个“数字”。这可能是一个正确的答案,但提供额外的代码解释会很有用,这样开发人员就可以理解你的推理。这对于可能不熟悉语法的新开发人员特别有用。此外,这有助于减少后续问题的需要。你介意用更多的细节更新你的评论吗?
  @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();
            }
        });