Tratamento de erros específicos através do envio de outro pedido, de forma transparente, em retrofit

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

  •  21-12-2019
  •  | 
  •  

Pergunta

Aqui é o caso, eu estou tentando lidar,

  • Se uma solicitação é executada, e a resposta indica que a autenticação de token é expirado,
  • enviar uma atualização de solicitação de token
  • se a atualização solicitação de token tiver êxito, repetir o pedido original

Este deve ser transparente para o chamando de Atividade, Fragmento...etc.A partir do chamador ponto de vista, é um pedido e uma resposta.

Eu realizei este fluxo de antes, quando usando OkHttpClient diretamente, mas não sei como conseguir isso em Retrofit.

Talvez algo relacionado a isso abrir problema sobre um ResponseInterceptor?

Se não há straight-forward maneira de conseguir isso em retrofit, qual seria a melhor forma de implementá-la?Uma base de classe de escuta?

Eu estou usando RoboSpice com Retrofit, bem como, se ele pode ser útil nesse caso.

Foi útil?

Solução

Desde que eu estou usando RoboSpice, acabei fazendo isso através da criação de um resumo 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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top