Gérer des erreurs spécifiques en envoyant une autre demande de manière transparente en rétrofit

StackOverflow https://stackoverflow.com//questions/22014958

  •  21-12-2019
  •  | 
  •  

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.

Était-ce utile?

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top