2015-11-23 1 views
1

Comment adapter le Retrofit 2.0 pour appeler le bon modèle en fonction de la réponse du serveur.Adaptation des réponses Retrofit 2.0 à l'aide de GSON pour une réponse réussie et échouée

i.e. JSON retour pour avec succès

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

i.e. JSON retour en cas d'échec

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

J'ai créé le modèle de connexion à l'aide http://www.jsonschema2pojo.org.

j'appelle

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

mais si la connexion a échoué je aurais besoin d'utiliser ceci:?

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

J'ai juste besoin du GSON pour mapper la réponse au bon modèle? Un conseil comment survivre à cela/ Merci.

Répondre

0

Une solution pour cela est d'écrire un sérialiseur personnalisé, parce que vous utilisez retrofit, je pense que vous pouvez vérifier SO Question

+0

Bonjour, Je trouve un grand article, mais c'est pour le Retrofit 1.9. Avez-vous comment mettre en œuvre pour 2.0 - sous la manipulation des erreurs -> http://blog.robinchutaux.com/blog/a-smart-way-to-use-retrofit/ Merci – Joolah

0

Pourquoi ne pas faire votre JSON avec succès

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

et le mal JSON

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

Créez une classe de modèle parent comme suit et étendez-la dans vos modèles SuccessModel et ErrorModel.

public class Model { 
    boolean error; 

    public boolean isError() { 
     return error; 
    } 

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

Ajoutez le code suivant juste avant la création par exemple Rénovation: `

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(); 
     } 
    }); 

Maintenant, modifiez votre méthode onResponse() comme suit:

@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 
       } 

      }