【问题标题】:How to retry a request in Moya with RxSwift?如何使用 RxSwift 在 Moya 中重试请求?
【发布时间】:2020-05-23 20:02:28
【问题描述】:

我是 RxSwift 的新手,我正在使用 Moya 和 RxSwift 在我的应用程序中建立网络。对于给定的 ProviderType,我有以下函数用于每个请求。

open func request(for target: ProviderType) -> Observable<Response> {

    return provider.rx.request(target)
        .filterSuccessfulStatusCodes()
        .asObservable()
        .catchError { [weak self] error in
          guard let self = self else {
            return Observable.error(error)
          }
          return Observable.error(self.handleError(with: error))
    }
}

这很好用,但现在我想在请求失败并获取刷新令牌后重试请求,状态码为 401。我发现this 对 GitHub 问题的评论告诉我如何实现它,但我仍然对它在我的情况下的工作方式感到困惑(评论没有提供与刷新令牌机制如何工作相关的上下文)。

【问题讨论】:

    标签: ios swift reactive-programming rx-swift moya


    【解决方案1】:

    我写了一篇关于遇到无效令牌时如何处理重试的文章。本文更深入,但 TLDR 是您需要使用 retryWhen 运算符而不是 catchError

    通过使用retryWhen,您可以侦听相应的错误,并在 401 进入时尝试刷新令牌。如果您获得新令牌,则只需从闭包的 Observable 发出一个值即可。如果刷新令牌失败,则简单地发出错误并说明原因。

    此外,在流的开头,您需要某种方式来插入刷新的令牌。

    https://medium.com/@danielt1263/retrying-a-network-request-despite-having-an-invalid-token-b8b89340d29

    【讨论】:

    猜你喜欢
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2017-04-27
    • 2023-03-09
    • 2016-03-14
    • 2017-01-12
    相关资源
    最近更新 更多