如果成功,我的web服务器将以以下形式返回JSON (200
状态代码):
{"success":true,"data":{"user_id":"20","username":"Bob"}}
但是,如果出了问题(例如,如果输入的用户名和密码在表单中太短),它将以以下形式返回JSON (400
状态代码):
{"success":true,"errors":{"username":["Username too short"],"password":["Incorrect password","Password too short"]}}
如何在改造中处理这两种不同的响应?到目前为止,这是我的代码:
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响应?
发布于 2015-10-27 02:06:35
你需要做两件事。首先,不要从服务器返回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以外的状态进行响应的实例,但通常来自服务器的错误响应是简单的纯文本,比如“坏请求”。当然,如果您希望从RetrofitError.getMessage()中提取json,可以插入json,但是GSON不会自动为您解析。我希望这能帮到你!
发布于 2015-10-27 00:42:10
您应该认识到,实际上,从网络请求的角度来看,您发布的两个响应都是成功的。失败状态是由于请求失败(网络连接错误、404等)。在尝试将用户登录到后端之后,您将不会失败。
您需要在成功方法中解析结果,并从应用程序逻辑的角度确定内部结果是否成功。
您还应该处理failure()。
发布于 2015-10-27 01:11:34
如果您从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();
}
}
也可以使用葛森处理JSON数据
https://stackoverflow.com/questions/33357830
复制相似问题