Gérer des erreurs spécifiques en envoyant une autre demande de manière transparente en rétrofit
Question
Voici le cas que j'essaie de gérer,
- Si une requête est exécutée et que la réponse indique que le jeton d'authentification a expiré,
- envoyer une demande de jeton d'actualisation
- si la demande de jeton d'actualisation réussit, réessayez la demande d'origine
Cela doit être transparent pour l'activité appelante, le fragment...etc.Du point de vue de l'appelant, il s'agit d'une demande et d'une réponse.
J'ai déjà atteint ce flux en utilisant directement OkHttpClient, mais je ne sais pas comment y parvenir dans Retrofit.
Peut-être quelque chose lié à cette ouverture problème à propos d'un ResponseInterceptor ?
S'il n'existe pas de moyen simple d'y parvenir en matière de rénovation, quelle serait la meilleure façon de le mettre en œuvre ?Une classe d'écoute de base ?
J'utilise également RoboSpice avec Retrofit, si cela peut être utile dans un tel cas.
La solution
Depuis que j'utilise RoboSpice, j'ai fini par le faire en créant un résumé BaseRequestListener
.
public abstract class BaseRequestListener<T> implements RequestListener<T> {
@Override
public void onRequestFailure(SpiceException spiceException) {
if (spiceException.getCause() instanceof RetrofitError) {
RetrofitError error = (RetrofitError) spiceException.getCause();
if (!error.isNetworkError()
&& (error.getResponse().getStatus() == INVALID_ACCESS_TOKEN_STATUS_CODE)) {
//I'm using EventBus to broadcast this event,
//this eliminates need for a Context
EventBus.getDefault().post(new Events.OnTokenExpiredEvent());
//You may wish to forward this error to your listeners as well,
//but I don't need that, so I'm returning here.
return;
}
}
onRequestError(spiceException);
}
public abstract void onRequestError(SpiceException spiceException);
}