我正在尝试实现一个刷新令牌进程。基本上,我有一个在一小时内到期的访问令牌,还有一个刷新令牌,发送到服务器以获得一个新的访问令牌。
我使用okhttp作为我的http客户端,它支持身份验证,但问题是,在身份验证方法中,我必须返回一个包含新访问令牌的请求对象。要做到这一点,首先我必须等待api调用来使用我提供的刷新令牌检索新的访问令牌,如您所知,这个过程需要一段时间才能完成。
我的问题是,如何等待结果的到来,然后返回请求对象?
class TokenAuthenticator : Authenticator {
override fun authenticate(route: Route?, response: Response): Request? {
//With RX
val newToken = getTokenFromServer()?.doOnSuccess {
return response.request().newBuilder().url("URL").addHeader("token", it.result?.token)
.build()
}
//First coroutine attempt
val job = runblocking { launch { getTokenFromServer() } }
job.join()
//... create request
return request
//Second coroutine attempt
val request = runBlocking {
val newToken = getTokenFromServer()
//... create new request object here using newToken
return@runBlocking request
}
return request
}
fun getTokenFromServer(): Single<ApiResponse>? {
//... gets data from server and returns the result
return newToken
}
}边注:
在使用RX时,我无法从doOnSuccess.
谢谢。
发布于 2021-06-26 15:23:26
事实证明,由于我们已经处于后台线程中,所以可以使用同步任务并等待响应。
override fun authenticate(route: Route?, response: Response): Request? {
//With RX
val newToken = getTokenFromServer().blockingGet()
return newToken
//Or a retrofit call object
val newToken = getTokenFromServer().execute()
return newToken
}https://stackoverflow.com/questions/68014348
复制相似问题