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