4

我有一个项目,我将 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 很陌生,所以我对我将用来执行此操作的运算符有点一无所知。

谢谢!

4

1 回答 1

-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 继续 observable 的执行。我们在此处定义的 observable 执行以下操作:

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