RxSwift - 递归 Observables?
RxSwift - Recursive Observables?
学习 RxSwift - 这是我的问题:
我有一个使用活动访问令牌获取数据的网络服务,每当令牌过期时,首先调用令牌生成 api,然后再次将当前请求调用到 运行。这样它将有一个有效结果的活动访问令牌。
但我在获取令牌响应然后调用上一个时遇到问题。要求?
所以我尝试添加一个可观察请求,然后作为响应检查令牌是否无效,然后调用另一个可观察到 return 活动令牌,一旦收到令牌,再次调用旧请求。
func apirequest(_ urlConvertible:URLRequestConvertible) -> Observable<[String:AnyObject]> {
return Observable.create({ observer -> Disposable in
let _ = Alamofire.request(urlConvertible).responseJSON
{ response in
if isTokenExpired() {
self.generateToken().subscribe(onNext: response {
self.apirequest(oldRequest)
})
}
}
return Disposables.create()
})
}
我期待任何 Rx 操作员或任何尝试的想法?
谢谢
我写了一篇关于如何做到这一点的文章:https://medium.com/@danielt1263/retrying-a-network-request-despite-having-an-invalid-token-b8b89340d29
将您的网络调用代码包装成这样:
/// Builds and makes network requests using the token provided by the service. Will request a new token and retry if the result is an unauthorized (401) error.
///
/// - Parameters:
/// - response: A function that sends requests to the network and emits responses. Can be for example `URLSession.shared.rx.response`
/// - tokenAcquisitionService: The object responsible for tracking the auth token. All requests should use the same object.
/// - request: A function that can build the request when given a token.
/// - Returns: response of a guaranteed authorized network request.
public func getData<T>(response: @escaping (URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)>, tokenAcquisitionService: TokenAcquisitionService<T>, request: @escaping (T) throws -> URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)> {
return Observable
.deferred { tokenAcquisitionService.token.take(1) }
.map { try request([=10=]) }
.flatMap { response([=10=]) }
.map { response in
guard response.response.statusCode != 401 else { throw TokenAcquisitionError.unauthorized }
return response
}
.retryWhen { [=10=].renewToken(with: tokenAcquisitionService) }
}
文章和随附的要点展示了如何编写 tokenAcquisitionService
并包括单元测试。
学习 RxSwift - 这是我的问题:
我有一个使用活动访问令牌获取数据的网络服务,每当令牌过期时,首先调用令牌生成 api,然后再次将当前请求调用到 运行。这样它将有一个有效结果的活动访问令牌。
但我在获取令牌响应然后调用上一个时遇到问题。要求?
所以我尝试添加一个可观察请求,然后作为响应检查令牌是否无效,然后调用另一个可观察到 return 活动令牌,一旦收到令牌,再次调用旧请求。
func apirequest(_ urlConvertible:URLRequestConvertible) -> Observable<[String:AnyObject]> {
return Observable.create({ observer -> Disposable in
let _ = Alamofire.request(urlConvertible).responseJSON
{ response in
if isTokenExpired() {
self.generateToken().subscribe(onNext: response {
self.apirequest(oldRequest)
})
}
}
return Disposables.create()
})
}
我期待任何 Rx 操作员或任何尝试的想法?
谢谢
我写了一篇关于如何做到这一点的文章:https://medium.com/@danielt1263/retrying-a-network-request-despite-having-an-invalid-token-b8b89340d29
将您的网络调用代码包装成这样:
/// Builds and makes network requests using the token provided by the service. Will request a new token and retry if the result is an unauthorized (401) error.
///
/// - Parameters:
/// - response: A function that sends requests to the network and emits responses. Can be for example `URLSession.shared.rx.response`
/// - tokenAcquisitionService: The object responsible for tracking the auth token. All requests should use the same object.
/// - request: A function that can build the request when given a token.
/// - Returns: response of a guaranteed authorized network request.
public func getData<T>(response: @escaping (URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)>, tokenAcquisitionService: TokenAcquisitionService<T>, request: @escaping (T) throws -> URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)> {
return Observable
.deferred { tokenAcquisitionService.token.take(1) }
.map { try request([=10=]) }
.flatMap { response([=10=]) }
.map { response in
guard response.response.statusCode != 401 else { throw TokenAcquisitionError.unauthorized }
return response
}
.retryWhen { [=10=].renewToken(with: tokenAcquisitionService) }
}
文章和随附的要点展示了如何编写 tokenAcquisitionService
并包括单元测试。