Адаптация ответов Retrofit 2.0 с использованием GSON для успешного и неудачного ответа

Как я могу адаптировать Retrofit 2.0 для вызова правильной модели в соответствии с ответом сервера.

то есть возврат Json для успешного

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

i.e Json return для Failed

{
  "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 сопоставил ответ с правильной моделью? Любой совет, как преодолеть это / Спасибо.


person Thiago    schedule 23.11.2015    source источник


Ответы (3)


Одним из решений для этого является написание пользовательского десериализатора, поскольку вы используете модификацию, я думаю, вы можете проверить это SO Вопрос

person reidzeibel    schedule 23.11.2015
comment
Привет, я нашел отличную статью, но это для Retrofit 1.9. Как реализовать для версии 2.0 — в разделе «Обработка ошибок» —> blog.robinchutaux.com/blog/a-smart-way-to-use-retrofit Спасибо. - person Thiago; 23.11.2015

Почему бы не сделать свой успешный json

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

и неправильный json

  {
        status:"failed",
        message:"wong email "
        seeesion_id:"-1"
    }
person jfxu    schedule 23.11.2015

Создайте родительский класс Model, как показано ниже, и расширьте его как в 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
                }

            }
person Harish Sharma    schedule 23.11.2015