Je ne parviens pas à obtenir le code d'état de la réponse de la réponse comme 200,201, etc. Comme nous pouvons facilement obtenir des codes d'erreur de la classe RetrofitError
comme error.isNetworkError()
et error.getResponse().getStatus()
. Existe-t-il une solution de contournement pour obtenir des codes d'état?
Selon Retrofit 2.0.2, l'appel est maintenant
@Override
public void onResponse(Call<YourModel> call, Response<YourModel> response) {
if (response.code() == 200) {
// Do awesome stuff
} else {
// Handle other response codes
}
}
J'espère que ça aide quelqu'un :-)
EDIT: De nombreuses applications pourraient également tirer parti de la vérification du succès (code de réponse 200-300) dans une clause, puis de la gestion des erreurs dans les autres clauses, telles que 201 (créé) et 202 (accepté) conduire à la même logique d'application que 200 dans la plupart des cas.
@Override
public void onResponse(Call<YourModel> call, Response<YourModel> response) {
if (response.isSuccessful()) {
// Do awesome stuff
} else if (response.code() == 401) {
// Handle unauthorized
} else {
// Handle other responses
}
}
vous pouvez obtenir le code de statut en cas de succès, comme vous le faites dans failure()
@Override
public void success(Object object, Response response) {
response.getStatus()//returns status code integer
}
puisque vous avez Response
objet dans le rappel de succès comme response.getStatus()
[~ # ~] éditer [~ # ~]
Je suppose que vous utilisez okhttp avec retrofit. ok http a un outil puissant appelé Interceptor
vous pouvez intercepter la réponse avant la modification de Callback et obtenir le code d'état de la réponse comme ceci:
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor(){
@Override
public Response intercept(Chain chain) throws IOException{
Request request = chain.request();
Response response = chain.proceed(request);
response.code()//status code
return response;
});
//then add it to you Restclient like this:
restAdapter = new RestAdapter.Builder()
.setEndpoint(URL_SERVER_ROOT)
.setClient(new OkClient(client)) //plus your configurations
.build();
pour en savoir plus sur les intercepteurs, visitez ici .
je l'ai réalisé en suivant les codes:
public abstract class BaseCallBack<T> {
public abstract void onSuccess(Response<T> response);
public abstract void onFailure(Response<T> response);
}
public abstract class SuccessCallback<T> extends BaseCallBack<T> implements Callback<T>{
@Override
public void onResponse(Call<T> call, Response<T> response) {
if(response.code()>= 400 && response.code() < 599){
onFailure(response);
}
else {
onSuccess(response);
}
}
@Override
public void onFailure(Call<T> call, Throwable t){
}
@Override
public void onSuccess(Response<T> response) {
}
@Override
public void onFailure(Response<T> response) {
}
}
Lorsque l'api restante renvoie 400, etc., la méthode onFailure est appelée par défaut. Si vous voulez faire quelque chose avec succès: (quand retourne 200, etc.)
ServiceConnector.api.getHomePage().enqueue(new SuccessCallback<Void>() {
@Override
public void onSuccess(Response<Void> response) {
super.onSuccess(response);
}
});