首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用okhttp进行身份验证时,此处不允许返回。

使用okhttp进行身份验证时,此处不允许返回。
EN

Stack Overflow用户
提问于 2021-06-17 06:54:44
回答 1查看 173关注 0票数 0

我正在尝试实现一个刷新令牌进程。基本上,我有一个在一小时内到期的访问令牌,还有一个刷新令牌,发送到服务器以获得一个新的访问令牌。

我使用okhttp作为我的http客户端,它支持身份验证,但问题是,在身份验证方法中,我必须返回一个包含新访问令牌的请求对象。要做到这一点,首先我必须等待api调用来使用我提供的刷新令牌检索新的访问令牌,如您所知,这个过程需要一段时间才能完成。

我的问题是,如何等待结果的到来,然后返回请求对象?

代码语言:javascript
复制
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.

  • In第一次协同器尝试中返回请求对象,使用job.join()需要身份验证方法作为挂起函数,并且不允许更改它。在第二次协同尝试中,

  • 似乎没有问题,但它不阻止UI线程这样做吗?或者因为整个过程发生在UI线程之外,所以应用程序不会冻结!?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-26 15:23:26

事实证明,由于我们已经处于后台线程中,所以可以使用同步任务并等待响应。

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68014348

复制
相关文章

相似问题

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