【问题标题】:Using coroutines in retrofit authenticator在改造验证器中使用协程
【发布时间】:2019-01-26 02:31:54
【问题描述】:

我正在尝试使用协程在改造中实现 JWT 令牌身份验证和刷新令牌。令牌存储在 Room 数据库中。我应该如何实现 await 调用?

目前我正在使用 runBlocking {...} 调用来等待异步本地/远程响应

例子:

client.addInterceptor {
        val accessToken = runBlocking { tokenRepository.getActiveToken() }?.access_token ?: "-"
        val request = it.request()
            .newBuilder()
            .addHeader("Authorization", "Bearer $accessToken")
            .build()
        return@addInterceptor it.proceed(request)
    }

我想遵循的是传统模式:

launch {
    withContext(IO){...}
}

我应该怎么做?

【问题讨论】:

  • 我在 Authenticator 中遇到了与 runBlocking{} 类似的问题,想知道我在这个线程中的回答是否相关:stackoverflow.com/questions/62950438/… 我更幸运的是用 Retrofit 的 Call 替换了协程并执行同步请求。

标签: android retrofit2 kotlinx.coroutines


【解决方案1】:

OkHttp 是一个 Java 库,使用同步请求拦截器。 Kotlin 的协程无法将同步代码转换为异步代码,它们只会让您已经异步的代码看起来像同步代码一样简单。 OkHttp 中已经有一个feature request 可以专门启用您要求的功能,但被拒绝了。原因是,从Java的角度来看,它把API弄得乱七八糟,实现复杂度也很高。

他们的建议是在 OkHttp 之外处理此问题,因此在您的情况下,首先以异步方式获取令牌,然后启动 HTTP 请求。

【讨论】:

  • 这是否意味着我们必须将这个逻辑添加到收到的每个响应中?
【解决方案2】:

我希望这对以后看到此内容的人有所帮助。您可以使用 runBlocking{ } 在身份验证器中运行异步代码,这是专门设计用于将常规阻塞代码连接到以挂起样式编写的库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 2021-05-21
    • 2020-07-17
    • 2016-05-16
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多