2017-04-19 49 views
0

我有令牌可以用它發出請求,這個令牌有一些lifeTime。 所以,當我得到401錯誤,我需要與其他請求refreshToken。 我想讓用戶順利進行(沒有任何中斷):如果得到401,比進行刷新,並且在用新的可用令牌重複第一個請求之後。如何用新的帖子值重複翻新請求

這裏是我的代碼:

@POST("/refresh_token") 
Observable<Auth> refreshToken(@Body BodyAuth body); 

@POST("/someLink") 
Observable<Answer> someRequest(@Body OtherBody body); 

Observable<Answer> makeSomeRequest(){ 
    retutn someRequest(new Body(currentToken)). 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .compose(StatusCodeVerifier()) 
       .retryWhen(RetryWithNewToken(requestManager)) 
} 

public class StatusCodeVerifier<T> implements Observable.Transformer<Response<T>,T> { 
    @Override 
    public Observable<T> call(Observable<Response<T>> responseObservable) { 
     return responseObservable. 
       flatMap(new Func1<Response<T>, Observable<?>>() { 
        @Override 
        public Observable<?> call(Response<T> tResponse) { 
         if (tResponse.code() == 401){ 
          throw new UnAuthorizedException("custom exception"); 
         } else { 
          return Observable.just(tResponse); 
         } 
        } 
       }); 
    } 
} 

public class RetryWithNewToken implements Func1<Observable<Throwable>, Observable<?>> { 

    private UserDataManager requestManger; 

    public RetryWithNewToken(RequestManager requestManger){ 
     this.requestManger = requestManger; 
    } 
    @Override 
    public Observable<?> call(final Observable<Throwable> attempts) { 
     return attempts.flatMap(new Func1<Throwable, Observable<?>>() { 
      @Override 
      public Observable<?> call(final Throwable throwableObservable) { 
       if (throwableObservable instanceof UnAuthorizedException){ 
        return requestManger. refreshToken().subscribe(new Action1<CbAuth>() { 
         @Override 
         public void call(TokenData newToken) { 
          updateToken(newToken); 
          //here i try to repeat previous request that was failed because of 401 error 
          Observable.just(attempts); 
         } 
        }); 
       } 
       return Observable.error(throwableObservable); 
      } 
     }); 
    } 
} 

稱爲成功refreshToken先前請求後,每一次,但它被稱爲無效(舊)數據。 那麼我怎樣才能用新的令牌數據重複請求?

回答

0

這是因爲你初始化你的someRequestObservable只有一次它的參數。當發生錯誤時,您只需重新訂閱它。但是你必須在每個訂閱上輪詢currentToken。這可以通過使用Observable.fromCallable運營商來完成:

Observable<Answer> makeSomeRequest(){ 
    return Observable.fromCallable(() -> currentToken) // called on each subscription 
       .flatMap(token -> someRequest(new Body(token))) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .compose(StatusCodeVerifier()) 
       .retryWhen(RetryWithNewToken(requestManager)) 
}