2015-12-09 64 views
5

我有一個項目,我正在使用Moya和RxSwift擴展。 簡單的用例工作正常,我能夠做出請求並以Observables的形式得到響應。使用RxSwift和Moya處理重新認證

public func test() -> Observable<Response> { 
    return provider 
    .request(.test) 
    .retry(5) 
} 

我可以訂閱observable並打印沒有問題的迴應。

但現在我需要處理驗證邏輯。它的工作方式是運行上述請求並添加一個作爲HTTP頭字段的令牌。 Moya通過在endpointClosure中使用endpointByAddingHTTPHeaderFields透明地允許我這樣做。到目前爲止沒有問題。

的問題出現時,請求失敗,HTTP狀態401,這意味着我需要通過調用另一個端點重新認證

provider.request(.auth(user, pass)).retry(5) 

這將返回另一個可觀察,我可以很容易地映射到JSON來獲得新的令牌。

然後我只需要再次調用test()

所以我的問題是...我如何添加這個驗證邏輯測試()內以上功能,所以可觀察到的由測試()返回已經保證已經運行了重新認證邏輯在發生故障的情況下並且是第二次重新認證的請求的結果。

我對RXSwift和RX一般都很陌生,所以對於我用來做這件事的操作員我有點無知。

謝謝!

+0

你有沒有解決過這個問題? – tskulbru

+0

401是否作爲錯誤出現,或者它是否是有效的響應對象? –

+0

如果前者,這個答案可能會幫助你:http://stackoverflow.com/questions/35841054/rxswift-user-input-on-error-and-continuation/38341690#38341690 –

回答

0
public func test(with authToken: String) -> Observable<Response> { 
    return provider 
     .request(.test) 
     .endpointByAddingHTTPHeaderFields(["Authorization": authToken]) 
     .catchError { error in 
     if needsReauth(error) { 
      return provider.request(.auth(user, pass)).map { parseToken($0) } 
      .flatMap { token in 
       return test(with: token) 
      } 
     } else { 
      return .error(error) 
     } 
     } 
} 

catchError能夠使用另一個觀察的繼續觀察到的執行。我們在此定義的可觀察性如下:

  1. 首先,它將請求.auth端點。
  2. 然後它從響應中讀取以獲得新的認證令牌
  3. 最後,我們遞歸地調用test(with authToken: String)來重試查詢測試開啓點。