2017-10-18 38 views
1

J'utilise Retrofit dans mon application pour télécharger des fichiers JSON depuis le serveur. Mais parfois quand je demande des données dupliquées du serveur il renvoie le code de réponse 208 avec le corps nul, mais dans 200 j'ai un corps de réponse qui n'est pas nul. Dans les corps nuls, la retrofit va à la méthode onFailure. Mon problème est ici! Je veux connaître la raison de l'échec de la demande (c'est parce que 208 (dans mon cas) ou d'autres choses). Comment puis-je obtenir le code de réponse dans la méthode OnFailure?Comment créer un nouveau CallBack Avec rétrofit

moi avons essayé de mettre en œuvre ma propre méthode de callback comme ceci:

public class DefaultCallback<T> implements Callback<T> { 

    private static final String TAG = "LOGO_SendReport"; 
    private Callback<T> callback; 

    public DefaultCallback(Callback<T> callback) { 
    this.callback = callback; 
    } 

    @Override 
    public void onResponse(Call<T> call, Response<T> response) { 
    if (response.body() == null) { 

     callback.onFailure(call, new NullPointerException("Empty response")); 
     Log.e(TAG, "Response code is: " + response.code()); 

    } else { 
     callback.onResponse(call, response); 
    } 
    } 

    @Override 
    public void onFailure(Call<T> call, Throwable t) { 
    Log.e(TAG, t.toString()); 
    callback.onFailure(call, t); 
    } 
} 

Ceci est mon appel:

@POST("office/report") 
    Call<ResponseSendReport> sendReport(@Body SendReport pendingList); 

Ceci est ma dernière méthode:

final APIService service = ServiceGenerator.createService(APIService.class, App.Auth); 

      Call<ResponseSendReport> call = service.sendReport(sendReport); 

      call.enqueue(new Callback<ResponseSendReport>() { 
       @Override 
       public void onResponse(Call<ResponseSendReport> call, Response<ResponseSendReport> response) { 

       Log.i("LOGO_SendReport", "code is: " + response.code()); 


       if (response.code() == 200) { 


       } 

       @Override 
       public void onFailure(Call<ResponseSendReport> call, Throwable t) { 

       /*When Response code is 208 Goes here and I want to get 
       response code 
       if it is 208 to handle it! */ 
       } 
      }); 

Nous vous remercions de ton aide.

Répondre

0

Vous pouvez créer des cas de classes et de poignées abstraites.

public abstract class DefaultCallback<T> implements Callback<T> { 

    @SuppressWarnings({"ConstantConditions", "unchecked"}) 
    @Override public void onResponse(@NonNull Call<T> call, Response<T> response) { 
     if (response.isSuccessful()) { 
      onSuccess(response.body(), response.code()); 
     } else { 
      onError(response.errorBody(), response.code()); 
     } 
    } 

    @Override public void onFailure(@NonNull Call<T> call, @NonNull Throwable throwable) { 
     onError(null, -1); 
    } 

    public abstract void onSuccess(@NonNull final T response, int code); 

    public abstract void onError(@Nullable ResponseBody body, int code); 
} 
0

Vous pouvez obtenir le code de réponse à l'intérieur de la méthode onResponse utilisant response.code()

@Override 
public void onResponse(Call<ResponseSendReport> call, Response<ResponseSendReport> response) { 
    if (response.isSuccessful()) { 
     if (response.code() == 208) { 
      //do sth 
     } else { 
      //do sth 
     } 
    } else { 
     //do sth 
    } 
} 
0

1.You peut simplement modifier votre appel:

@POST("office/report") 
Call<Response<ResponseSendReport>> sendReport(@Body SendReport pendingList); 

2.Le est votre méthode finale:

@Override 
public void onFailure(Call<Response<ResponseSendReport>> response, Throwable t) { 

    response.code() // /** HTTP status code. */ 
    response.body() //your object 
      } 
     });