我有一个项目,我使用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都很陌生,所以对于我用来做这个操作的操作员我有点无能为力。
谢谢!
答案 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继续执行可观察的执行。我们在此定义的可观察量如下:
.auth
端点。test(with authToken: String)
重试查询测试点。