使用改造和可观察的解析REST响应消息

时间:2019-03-15 16:31:20

标签: java json rest observable retrofit2

当我使用错误的登录信息(使用邮递员)时,我的API会返回此信息:

{
    "error": {
        "statusCode": 401,
        "name": "Error",
        "message": "login failed",
        "code": "LOGIN_FAILED",
        "stack": "Error: login failed\n    at ...path..."
    }
}

我正在使用这种方法来获取响应消息:

private void handleResponse(retrofit2.Response<Response> response) {

            if (response.isSuccessful()) {
                emailField.setText(null);
                passwordField.setText(null);

                Intent intent = new Intent(getActivity(), MainActivity.class);
                startActivity(intent);
            } else {
                try {
                    showSnackBarMessage(response.errorBody().string());
                } catch (Exception e) {
                    showSnackBarMessage(e.getMessage());
                }
            }
}

输出(小吃店显示的内容)与邮递员返回的内容相同。

handleresponse参数retrofit2.Response<Response> responseretrofit2 Response和我自己的<Response>类组成,如下所示:

public class Response {
    @SerializedName("message")
    @Expose
    private String message;

    public String getMessage() {
        return message;
    }
}

如何只让message出现在snackbar中?

我尝试了以下代码,但仅得到No value for message

try {
     JSONObject jObjError = new JSONObject(response.errorBody().string());
     Toast.makeText(getContext(), jObjError.getString("message"), Toast.LENGTH_LONG).show();
} catch (Exception e) {
     Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}

1 个答案:

答案 0 :(得分:0)

根据您的json,响应错误正文是一个对象,该对象的字段为error,其中包含字段message。这意味着您首先需要获取错误对象,然后获取消息:

JSONObject jObjError = new JSONObject(response.errorBody().string()).getJSONObject("error");
Toast.makeText(getContext(), jObjError.getString("message"), Toast.LENGTH_LONG).show();