【问题标题】:How to make another api call only if 1st api call fails using retrofit rxjava仅当使用改造 rxjava 的第一个 api 调用失败时如何进行另一个 api 调用
【发布时间】:2019-05-15 17:58:26
【问题描述】:

我是改造和 rxjava 的新手。我正在尝试使用这两个来实现一个非常常见的用例,但无法找到合适的操作员来做。用例 - 我正在调用 API 来检查我的访问令牌是否有效。如果它不再有效,我会得到 401 未经授权的异常,此时我想进行 API 调用以使用刷新令牌获取新的访问令牌。 注意 - 两个 API 请求的响应类型不同。

我如何使用改造和 rxjava 来实现这一点。

我尝试使用 flatMap、onErrorResume 来实现它,但无法找出最佳方法。

【问题讨论】:

  • 嗨@Tuby 我尝试了解决方案。它在我的情况下不起作用,因为对于验证请求,我得到了 okhttp3.Response,而对于刷新令牌请求,我得到了自定义 LoginResponse,在其中我得到了新的 accesstoken 值。如果两个请求的响应相同,您提供的解决方案可以正常工作。您能否为此提出解决方法。
  • 谢谢@Tuby 用你提供的解决方案玩了一下,问题现在已经解决了。

标签: android kotlin retrofit2 rx-java2


【解决方案1】:
requestApi.checkAccessToken(accessToken).flatMap(
     object : Function<Response, Observable<Response>> {
         override fun apply(t: Response): Observable<Response> {
            if (t.code() === 400) {
              return requestApi.getAccessToken(refreshToken,"refreshToken").flatMap(
               object : Function<LoginResponse, Observable<Response>> {
                 override fun apply(t: LoginResponse): Observable<Response> {
                        return requestApi.checkAccessToken(t.access_token)
            }
          })
       } else {
          return Observable.just(t)
       }
    }
 }).subscribeOn(Schedulers.io())
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(this::handleAccessTokenResponse, this::handleError)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 2017-01-11
    • 2022-01-10
    • 2022-10-01
    • 2021-10-20
    • 2021-09-05
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多