使用GSON调整Retrofit 2.0响应以获得成功和失败的响应

时间:2015-11-23 04:21:46

标签: android json gson retrofit androidhttpclient

如何根据服务器响应调整Retrofit 2.0以调用正确的模型。

即Json成功返回

{
  "status": "successful",
  "session_id": "123",
}

即Json返回失败

{
  "status": "fail",
  "message": "Wrong Email",
}

我使用http://www.jsonschema2pojo.org创建了登录模型。

然后我打电话给

@FormUrlEncoded
@POST(Constant.API_LOGIN)
Call<UserLogIn> userLogin(@FieldMap Map<String, String> params);

但如果登录失败,我需要使用它:?

@FormUrlEncoded
@POST(Constant.API_LOGIN)
Call<UserLogInFalied> userLogin(@FieldMap Map<String, String> params);

我只需要GSON将响应映射到正确的模型? 任何建议如何过来/ 感谢。

3 个答案:

答案 0 :(得分:0)

对此的一个解决方案是编写自定义反序列化器,因为您正在使用改造,我认为您可以检查这个SO Question

答案 1 :(得分:0)

为什么不让你成功的json

{
    status:"successful",
    message:" "
    seeesion_id:"123"
}

和错误的json

  {
        status:"failed",
        message:"wong email "
        seeesion_id:"-1"
    }

答案 2 :(得分:0)

创建一个像下面这样的父模型类,并在SuccessModel和ErrorModel中扩展它。

public class Model {
    boolean error;

    public boolean isError() {
        return error;
    }

    public void setError(boolean error) {
        this.error = error;
    }}

在创建Retrofit实例之前添加以下代码:`

OkHttpClient client = new OkHttpClient();
    client.interceptors().add(new Interceptor() {
        @Override
        public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            com.squareup.okhttp.Response response     =chain.proceed(request);

            MediaType content = MediaType.parse("Application/Json");

            String res = response.body().string();
            try {
                JSONObject obj = new JSONObject(res);
                if (obj.getString("status").equals("fail")) {
                    obj.put("error", true);
                    res = obj.toString();
                }else{
                 return response;
             }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            ResponseBody b = ResponseBody.create(content, res);
            return response.newBuilder().body(b).build();
        }
    });

现在,按如下方式编辑onResponse()方法:

  @Override
            public void onResponse(Response<Model> response) {
                Model model = response.body();
                if (model.isError()) {
                     ErrorModel errorModel = (ErrorModel) model;
                    // your code accordingly
                } else {
                    SuccessModel successModel = (SuccessModel)model;
                  // your code accordingly
                }

            }