Rx java 使用RxJava进行透明身份验证令牌刷新

Rx java 使用RxJava进行透明身份验证令牌刷新,rx-java,Rx Java,我希望在我的Java应用程序中使用Observable来包装经过身份验证的调用,如果有必要,它将在发出请求之前重新授权我的用户。我在Objective-C中使用以下方法对ReactiveCocoa进行了类似的操作: RAC信号是对可观测信号的反应性模拟。此方法创建一个RACSignal,该RACSignal将捕获初始请求发出的任何错误信号,如果该错误符合给定条件(在本例中,拒绝访问且存在可用的身份验证令牌),将透明地触发一个新RACSignal以使用刷新令牌,然后重新发送原始信号 RxJava是

我希望在我的Java应用程序中使用Observable来包装经过身份验证的调用,如果有必要,它将在发出请求之前重新授权我的用户。我在Objective-C中使用以下方法对ReactiveCocoa进行了类似的操作:

RAC信号是对可观测信号的反应性模拟。此方法创建一个RACSignal,该RACSignal将捕获初始请求发出的任何错误信号,如果该错误符合给定条件(在本例中,拒绝访问且存在可用的身份验证令牌),将透明地触发一个新RACSignal以使用刷新令牌,然后重新发送原始信号


RxJava是否提供类似的功能?我在文档中找不到任何类似于
catch:
的东西。

它看起来不像RxJava中预先存在的任何东西,但这似乎很好(相当直接地翻译了ReactiveCocoa的catch):

可观察的公共类{
公共接口CaughtErrorHandler{
公众可观测误差(可丢弃);
}
公共静态可观测catchObserver(最终可观测,最终CaughtErrorHandler errorHandler){
return Observable.create(new Observable.onSubscribeeFunc()){
@凌驾

public Subscription on Subscribe(最终观察者)我如何将其用于所有对rest服务进行改装的呼叫?我想捕获401(令牌已过期)从服务器,刷新令牌,并在收到令牌后重试给定的请求。实际上,框架中现在内置了一个操作员,因此我上面所做的CatchObservable不是很必要。我认为onErrorResumeNext?在任何情况下,如果您提出一个关于如何做您想要的事情的新问题,我很乐意帮助回答(或者其他人可能会比我抢先一步)。写完后,请在这里链接!嗨,这是我发布的问题,如果你能帮我的忙,我很感激你看到了这个并检查了它,看起来其他人已经提供的答案很好!
- (RACSignal *)doRequestAndRefreshTokenIfNecessary:(RACSignal *)requestSignal {
    return [requestSignal catch:^(NSError *error) {
        // Catch the error, refresh the token, and then do the request again.
        BOOL hasRefreshToken = [UserManager sharedInstance].refreshToken != nil;
        BOOL httpCode401AccessDenied = error.code == -1011;
        if (httpCode401AccessDenied && hasRefreshToken) {
            NSLog(@"Will attempt to refresh access token.");
            return [[[self refreshToken] ignoreValues] concat:requestSignal];
        }
        return requestSignal;
    }];
}
public class CatchObservable  {
    public interface CaughtErrorHandler {
        public Observable<?> onError(Throwable throwable);
    }

    public static <T> Observable catchObserver(final Observable<T> observable, final CaughtErrorHandler errorHandler) {
        return Observable.create(new Observable.OnSubscribeFunc<T>() {
            @Override
            public Subscription onSubscribe(final Observer<? super T> subscriber) {
                return observable.subscribe(new Observer<T>() {
                    @Override
                    public void onCompleted() {
                        subscriber.onCompleted();
                    }

                    @Override
                    public void onError(Throwable e) {
                        Observable observable = errorHandler.onError(e);
                        observable.subscribe(subscriber);
                    }

                    @Override
                    public void onNext(T args) {
                        subscriber.onNext(args);
                    }
                });
            }
        });
    }
}
private Observable refreshAuthIfNecessary(final Observable<?> request) {
    return CatchObservable.catchObserver(request, new CatchObservable.CaughtErrorHandler() {
        @Override
        public Observable<?> onError(Throwable throwable) {
            return Observable.concat(WebServices.this.refreshAuth(), request);
        }
    });
}