使用RxSwift和Moya处理重新身份验证

时间:2015-12-09 09:47:35

标签: ios swift rx-swift

我有一个项目,我使用Moya和RxSwift扩展。 简单的用例工作正常,我能够以Observables的形式提出请求和获得响应。

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)

这将返回另一个Observable,我可以轻松地映射到JSON以获取新令牌。

然后我必须再次调用 test()

所以我的问题是...... 如何在上面的 test()函数中添加此身份验证逻辑,以便 test返回Observable( )已经保证在发生故障时运行重新认证逻辑,并且是第二次重新认证的请求的结果。

一般来说,我对RXSwift和RX都很陌生,所以对于我用来做这个操作的操作员我有点无能为力。

谢谢!

1 个答案:

答案 0 :(得分:-1)

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允许使用另一个observable继续执行可观察的执行。我们在此定义的可观察量如下:

  1. 首先,它会请求.auth端点。
  2. 然后从响应中读取以获取新的身份验证令牌
  3. 最后,我们递归调用test(with authToken: String)重试查询测试点。