首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SwiftUI组合刷新令牌

使用SwiftUI组合刷新令牌
EN

Stack Overflow用户
提问于 2020-01-13 15:12:24
回答 1查看 3.3K关注 0票数 5

我试图在Swift 5和iOS组合框架中实现刷新令牌策略。

我不打算使用任何第三方包,只使用框架URLSession.dataTaskPublisher提供的内容,所以mu的目标是:

  1. 提出请求
  2. 如果请求失败了401,刷新auth令牌(这是另一个请求)
    1. 完成刷新令牌后,重试第一个请求。
    2. 如果失败,则抛出调用方要处理的错误。

这是一个非常琐碎的用例,但似乎很难在组合中实现,这使得它在任何实际生活场景中都很难使用。

欢迎任何帮助!

这是我的尝试,但不太可能起作用

代码语言:javascript
复制
private func dataTaskPublisherWithAuth(for request: URLRequest) -> URLSession.DataTaskPublisher {
    return session.dataTaskPublisher(for: request)

        .tryCatch { error -> URLSession.DataTaskPublisher in
guard error.errorCode == 401 else {
throw error
}
var components = URLComponents(url: self.baseUrl, resolvingAgainstBaseURL: true)
components?.path += "/refresh"
components?.queryItems = [
URLQueryItem(name: "refresh_token", value: KeychainHelper.RefreshToken),
]

let url = components?.url
var loginRequest = URLRequest(url: url!)
loginRequest.httpMethod = "GET"
loginRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")

return session.dataTaskPublisher(for: loginRequest)
.decode(type: LoginResponse.self, decoder: JSONDecoder())
.map { result in
if result.accessToken != nil {
// Save access token
KeychainHelper.AccessToken = result.accessToken!
KeychainHelper.RefreshToken = result.refreshToken!
KeychainHelper.ExpDate = Date(timeIntervalSinceNow: TimeInterval(result.expiresIn!))
}
return result
}
.flatMap { data -> URLSession.DataTaskPublisher in
session.dataTaskPublisher(for: request)
}
    }.eraseToAnyPublsiher()

}
EN

回答 1

Stack Overflow用户

发布于 2020-01-13 21:42:23

您应该在Publisher 这里上使用这里方法。这允许您用另一个发布服务器替换一个错误(例如用刷新请求替换错误401,然后是map switchToLastest auth请求),或者用另一个错误替换错误(在本例中,如果不是401,则只抛出原始错误)。

请注意,您可能不应该在这里使用flatMap,因为它与Rx中的.flatMapLatest或Reactive中的.flatmap(.latest)不一样。你想养成在联合收割机中使用.mapswitchToLatest的习惯(即苹果公司认为平面化和映射是两个独立的操作符)。如果不这样做,您将在一些生成多个内部发布者的地方遇到麻烦,例如键入时进行搜索,因为不是获取最近的内部值,而是按任意顺序获得所有这些值,因为网络请求在不确定的时间内完成。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59719270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档