改造:处理错误JSON响应
我的Web服务器采用以下形式返回JSON如果成功(200
状态码):改造:处理错误JSON响应
{"success":true,"data":{"user_id":"20","username":"Bob"}}
但是,如果出了问题(例如,如果用户名和密码,进入太短的形式),它在下面的表格(400
状态代码返回JSON):
{"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响应?
你需要做两件事。 首先,不要从服务器返回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状态响应,但是从服务器通常错误响应是简单的纯文本,如“错误的请求”。你当然插入的可能json如果你希望你可以从RetrofitError.getMessage()中提取,但是GSON不会自动为你解析。我希望这有帮助!
您应该认识到,实际上您发布的两个响应都是从网络请求角度看的成功。 失败状态用于请求失败(网络连接错误,404等),而不是尝试在后端登录用户后返回的失败。
您需要解析成功方法中的结果,并根据您的应用程序逻辑视角来决定内部结果是否成功。
你应该离开也处理失败()。
因此,如果我现在的模型类看起来像这样,我应该如何修改它以处理错误? HTTP://引擎收录。com/nkSScAS3 – user5486944
考虑为你的响应添加一个状态,e,g,: \t private int statusCode; 这样服务器可以指示登录成功的天气: 0 - 登录成功 1-错误的用户名/密码 2-未知错误 –
如果您从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数据
翻新默认使用GSON。这已经发生了 –
所以我应该返回错误响应作为状态码'200'以及?为什么?我怎么能找到成功的回应和错误回应之间的区别? – user5486944
如果响应是400,那么这是一个失败,因此应该这样对待...... 您可以考虑重新构建模型,以便处理“数据”对象和“错误”对象。 –