首页 > 解决方案 > 使用改造和可观察解析 REST 响应消息

问题描述

当我使用错误的登录信息(使用邮递员)时,我的 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();
}

标签: javajsonrestobservableretrofit2

解决方案


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

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

推荐阅读