gpt4 book ai didi

android - Retrofit & RxJava2 刷新 token 并重试

转载 作者:行者123 更新时间:2023-11-29 02:29:51 25 4
gpt4 key购买 nike

我有一个登录端点,通过它接收 authToken 和 refreshToken。第一个在一小时后到期,所以我应该使用第二个来刷新它并继续申请流程。

现在我的应用程序到处都是改造调用,我可能会在任何给定时刻收到 401,所以我如何做到每次收到 401 发出刷新 token ,然后重试原始请求?

这是我的刷新签名:

 @POST("/auth/actions/refresh")
fun refreshToken(@Body tokenRefresh: TokenRefresh): Single<LoginResponse>

我考虑过使用 withAuth() 方法创建一个基础存储库类,该方法接受任何 Observable/Single/Flowable 然后应用此逻辑,但我找不到实现它的方法。

看到了一堆实现,但没有一个符合我的需求...任何人都可以将我推向正确的方向吗?

This is the closest我发现了,但是平面映射似乎有一些错误

最佳答案

我只是遇到了类似的需求,并提出了以下解决方案。这非常简单,它只是尝试调用 REST 端点,如果该调用因 HTTP 401 而失败,它会重新验证并再次重复调用。否则它只会发出原始错误。

fun <T> Single<T>.withAuth() = retryWhen { errors ->
var firstAttempt = true
errors.flatMapSingle { error ->
if (firstAttempt && error is HttpException && error.code() == 401) {
firstAttempt = false
reauthenticate()
} else {
Single.error(it)
}
}
}

其中重新验证函数具有以下签名:

fun reauthenticate(): Single<AnyAuthResponse>

请注意,具体的异常类型可能取决于您实际使用的 HTTP 实现,因此您可能希望更新检测 HTTP 401 响应的条件,但代码应该为您提供如何解决问题的总体情况。

关于android - Retrofit & RxJava2 刷新 token 并重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50117228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com