Home Articles

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

Asked
Viewed 746 times
4

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

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

然后我可以订阅observable并打印响应没有问题 .

但现在我需要处理身份验证逻辑 . 它的工作方式是我使用添加为HTTP标头字段的标记运行上述请求 . Moya允许我通过在endpointClosure中使用endpointByAddingHTTPHeaderFields来透明地实现这一点 . 到目前为止没问题 .

当请求以HTTP状态401失败时,会出现问题,这意味着我需要通过调用另一个 endpoints 来重新进行身份验证

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

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

然后我只需再次调用test()!

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

我对RXSwift和RX一般都很新,所以我对我用来做这个的操作员有点无能为力 .

谢谢!

1 Answer

  • -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执行以下操作:

    • 首先,它将请求 .auth endpoints .

    • 然后从响应中读取以获取新的身份验证令牌

    • 最后,我们递归调用 test(with authToken: String) 重试查询测试点 .

Related