2015-10-27 87 views
0

我的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响应?

+0

所以我应该返回错误响应作为状态码'200'以及?为什么?我怎么能找到成功的回应和错误回应之间的区别? – user5486944

+0

如果响应是400,那么这是一个失败,因此应该这样对待...... 您可以考虑重新构建模型,以便处理“数据”对象和“错误”对象。 –

回答

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状态响应,但是从服务器通常错误响应是简单的纯文本,如“错误的请求”。你当然插入的可能json如果你希望你可以从RetrofitError.getMessage()中提取,但是GSON不会自动为你解析。我希望这有帮助!

1

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

您需要解析成功方法中的结果,并根据您的应用程序逻辑视角来决定内部结果是否成功。

你应该离开也处理失败()。

+0

因此,如果我现在的模型类看起来像这样,我应该如何修改它以处理错误? HTTP://引擎收录。com/nkSScAS3 – user5486944

+0

考虑为你的响应添加一个状态,e,g,: \t private int statusCode; 这样服务器可以指示登录成功的天气: 0 - 登录成功 1-错误的用户名/密码 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数据

+0

翻新默认使用GSON。这已经发生了 –