通过在改造中透明地发送另一个请求来处理特定错误

Posted

技术标签:

【中文标题】通过在改造中透明地发送另一个请求来处理特定错误【英文标题】:Handling specific errors by sending another request transparently in retrofit 【发布时间】:2014-03-27 17:18:14 【问题描述】:

这是我要处理的情况,

如果请求被执行,并且响应表明身份验证令牌已过期, 发送刷新令牌请求 如果刷新令牌请求成功,重试原始请求

这对调用Activity、Fragment...等应该是透明的。从调用者的角度来看,这是一个请求,一个响应。

我之前直接使用OkHttpClient的时候已经实现了这个流程,但是我不知道在Retrofit中如何实现。

也许与这个开放的issue 相关的关于 ResponseInterceptor 的东西?

如果在改造中没有直接的方法来实现这一点,那么实现它的最佳方法是什么?监听器基类?

如果在这种情况下有用的话,我也在使用带有 Retrofit 的 RoboSpice。

【问题讨论】:

你有没有找到你喜欢的解决方案?我有一个类似的用例......看起来改造 2.0 将能够以一种简单的方式处理这个问题,但我的谷歌搜索并没有发现 1.X 版本的任何内容 对于同一案例还有另一个悬而未决的问题:***.com/questions/22450036/… 检查问题上的 cmets,可能有一些线索。由于我使用的是 RoboSpice,我认为这将属于 loadFromNetwork() 中的基本 RetrofitSpiceRequest。虽然我没有时间回到它,但我会尽快尝试。 @danb 如果您使用OkHttp 作为您的HTTP clientRetrofit >= 1.9,那么您可以使用新的Interceptor。有关示例,请参阅my answer here。否则,我们将需要等待Retrofit 2.0 被释放。 【参考方案1】:

由于我使用的是 RoboSpice,因此我最终通过创建抽象 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);

【讨论】:

以上是关于通过在改造中透明地发送另一个请求来处理特定错误的主要内容,如果未能解决你的问题,请参考以下文章

正在发送多个改造电话,但有些电话从未收到响应或错误

axios post 请求挂在有效请求上

Kotlin 使用协程处理改造请求

其他所有请求的状态 500“错误:无法处理请求”

通过错误处理来理解三次握手和四次挥手

使用不同类型的响应改造错误处理