如果成功(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响应?
答案 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数据