Retrofit:处理错误JSON响应

时间:2015-10-27 00:13:07

标签: android json retrofit

如果成功(200状态代码),我的Web服务器将以下列形式返回JSON:

{"success":true,"data":{"user_id":"20","username":"Bob"}}

但是如果出现问题(例如,如果输入的用户名和密码在表单中太短),它将返回以下格式的JSON(400状态代码):

{"success":true,"errors":{"username":["Username too short"],"password":["Incorrect password","Password too short"]}}

如何在Retrofit处理这两个不同的回复?到目前为止,这是我的代码:

RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint(URL)
        .build();

ApiEndpointInterface api = restAdapter.create(ApiEndpointInterface.class);

api.getToken('1', new Callback<DefaultResponse>() {
    @Override
    public void success(DefaultResponse json, Response response) {
        //
    }

    @Override
    public void failure(RetrofitError response) {
        //
    }
});

如何处理这两种不同结构的JSON响应?

3 个答案:

答案 0 :(得分:2)

你需要做两件事。 首先,不要从服务器返回400。正如其他人所说,你实际上已经从服务器得到了成功的响应,所以你只需要解析你的错误。

您的服务器可以返回一个标志,指示登录成功或失败。 之后,您只需将错误模型添加到DefaultResponse模型即可。像这样

public class DefaultResponse {
        public boolean success;
        public DataModel data;
        public ErrorModel errors;


    public static class DataModel {
        private String user_id;
        private String username;
    }

    public static class ErrorModel { ... }
}

您仍然需要处理服务器使用除OK以外的状态响应的实例,但通常来自服务器的错误响应是简单的纯文本,例如&#34;错误请求&#34; ..您当然可以插入json如果你希望从RetrofitError.getMessage()中提取哪个,但是GSON不会自动为你解析。我希望这有帮助!

答案 1 :(得分:1)

您应该意识到,实际上您发布的两个响应都是从网络请求的角度来看是成功的。 失败状态是请求失败(网络连接错误,404等),而不是您在尝试在后端登录用户后返回的失败。

您需要在成功方法中解析结果,并从应用逻辑角度确定内部结果成功的天气。

你应该在场外处理失败()。

答案 2 :(得分:0)

如果您从Web服务获得JSON,这意味着它的成功。

所以,在你的成功方法中,抓住JSON并处理它

例如,来自您的JSON格式

    @Override
        public void success(DefaultResponse json, Response response) {
           try {
            JSONObject json = new JSONObject(json);
            JSONObject data = json.get("data"); // if no "data" element, it will throw JSONException
        } catch (JSONException e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(),"username to short",Toast.LENGTH_SHORT).show();
             }
        }

或者您可以使用GSON来处理您的JSON数据