3
我使用的是Retrofit 2和RxJava 2适配器。Retrofit 2 + RxJava retryWhen
每当服务器返回401未经授权,我刷新令牌和重试请求:
apiCall.retryWhen(es -> es
.flatMap(e -> {
if (isUnauthorizedException(e)) {
return refreshToken();
}
return Flowable.<User>error(e);
}));
凡refreshToken是一个简单的改装电话:
public Flowable<User> refreshToken() {
return retrofitService.login(userCredentials);
}
现在,我想限制这种刷新的次数是可能的。但是,简单地添加take(1)
不起作用,因为然后重试时在onNext后立即收到onCompleted并在重试之前取消请求。
当然我可以做take(2)
来达到预期的效果,但它看起来像一个黑客攻击。
使用Rx操作符实现它的最优雅的方法是什么?还有一个运营商与“断言”逻辑(摆脱if
在平面地图)?
另外我知道我可以使用OkHttp拦截器实现相同的功能,但我对Retrofit-RxJava解决方案感兴趣。
您是否尝试过“重试”? - ''public flowable refreshToken(){ return retrofitService.login(userCredentials).retry(3); }'' - 在发出错误之前会重试最多3次。 –
Fred