改造2处理动态错误

时间:2019-11-18 09:02:29

标签: android error-handling retrofit2

我正在使用改造2,其中我正在向其他服务器发送请求。我在解析服务器上的错误响应时遇到问题。作为示例,我展示了注册api调用。

一个我用服务器数据库中不存在的电子邮件击中了此端点,我收到以下回执:

{
    "id": "90c51a63-9a5d-46ee-9da6-7227f7042373",
    "email": "tkosaev@abv.bg",
    "username": "TOdor",
    "phoneNumber": null,
    "phoneNumberIsVerified": false,
    "isIdenfyVerified": false
}

我能够将上述json解析为Java对象。问题来了,如果我想捕获错误,例如如果我使用同一封电子邮件,则后端将返回400状态,并显示该邮件已经存在的消息,因为已经有用户使用同一封电子邮件注册。在下面,您可以找到json的外观,我的问题是如何解析此响应。

  {
      "Message": "One or more validation failures have occurred.",
      "Failures": {
          "Email": [
             "Email already exists."
          ]
       }
  }

PS:请记住,电子邮件对象可能会根据来自服务器的不同错误而更改。有没有办法优雅地处理这个问题。

亲切的问候

2 个答案:

答案 0 :(得分:1)

您可以通过此onResposne()

获得错误响应
try {
  JSONObject jObjError = new JSONObject(response.errorBody().string());
  Log.e("Error ", "response : " + jObjError);
} catch (JSONException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

您可以通过以下方式检查api状态代码

response.code()

答案 1 :(得分:0)

创建一个模型来处理您的自定义错误

class CustomError {
    String Message;
    List<String> Failures;

    ...

    //getter and setter
}

然后使用翻新responseBodyConverter解析您的错误模型,如下所示:

public CustomError getCustomError(ResponseBody responseBody) {
    CustomError customError;

    Converter converter = retrofit.responseBodyConverter(CustomError.class, new Annotation[] {});

    try {
        customError = (CustomError) converter.convert(responseBody);
    } catch (Exception ex) {
        customError = null;
    }

    return customError;
}

并尝试如下更改响应,以动态处理

{
    "Message": "One or more validation failures have occurred.",
    "Failures": [
        "Email already exists.",
        "Invalid phone number",
        "Username not found"
    ]
}