2015-12-09 11 views
5

私はMoyaとRxSwift拡張機能を使用しているプロジェクトを持っています。 シンプルなユースケースは正常に動作しますが、リクエストを行い、Observablesの形式でレスポンスを得ることができます。RxSwiftとMoyaによる再認証の処理

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

私は観察可能なものを購読し、問題なく応答を印刷することができます。

今は認証ロジックを処理する必要があります。それが動作する方法は、上記の要求をHTTPヘッダーフィールドとして追加されたトークンで実行することです。 Moyaは、endpointByAddingHTTPHeaderFieldsをendpointClosureに使用することで、透過的に私にそれを許可します。これまでのところ問題ありません。要求が

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

これは私が簡単に新しいを取得するためにJSONにマッピングすることができるという別の観測を返し、私は別のエンドポイントを呼び出して再認証する必要があることを意味HTTPステータス401で失敗したとき

問題が発生しますトークン。

私は()に再度電話する必要があります!

は、だから私の質問は、観察可能ではすでに再実行していることが保証される)テスト(で返されるようにがどのように私は、上記テストの内側()機能をこの認証ロジックを追加することができます...です失敗した場合の認証ロジックであり、第2の再認証された要求の結果である。

私は一般的にRXSwiftとRXの新機能ですから、これを行うために使用する演算子については少しわかりません。

ありがとうございます!

+0

これを解決しましたか? – tskulbru

+0

401はエラーとして処理されますか、それとも有効な応答オブジェクトですか? –

+0

前者の場合は、この回答が役に立ちます:http://stackoverflow.com/questions/35841054/rxswift-user-input-on-error-andcontinuation/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)を呼び出して、テストポイントのクエリを再試行します。
関連する問題