Gestire errori specifici inviando un'altra richiesta in modo trasparente in retrofit
Domanda
Ecco il caso che sto cercando di gestire,
- .
- Se viene eseguita una richiesta, e la risposta indica che il token dell'auth è scaduto,
- Invia una richiesta di aggiornamento del token
- Se la richiesta del token di aggiornamento ha successo, riprova la richiesta originale
Questo dovrebbe essere trasparente per l'attività chiamante, il frammento ... ecc. Dal punto di vista del chiamante, è una richiesta e una risposta.
Ho raggiunto questo flusso prima quando si utilizza direttamente OKHTTPCLINT, ma non so come ottenere questo in retrofit.
Forse qualcosa correlato a questo aperto Edizione A proposito di un reazione intercettore?
Se non c'è un modo diretto per ottenere questo in retrofit, quale sarebbe il modo migliore per implementarlo?Una classe di ascolto di base?
Sto usando anche robospice con retrofit, se può essere utile in tal caso.
Soluzione
Dato che sto usando robospice, ho finito per farlo creando un BaseRequestListener
astratto.
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);
}
.