在改装认证器中使用协程
Using coroutines in retrofit authenticator
我正在尝试使用协程在改造中实现 JWT 令牌身份验证和刷新令牌。令牌存储在 Room 数据库中。我应该如何实现等待调用?
目前我正在使用 runBlocking {...} 调用来等待异步 local/remote 响应
示例:
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){...}
}
我该怎么办?
OkHttp 是一个 Java 库并使用同步请求拦截器。 Kotlin 的协程无法将同步代码转换为异步代码,它们只会让您已经异步的代码看起来像同步代码一样简单。 OkHttp 中已经有一个 feature request 可以专门启用您的要求,但被拒绝了。原因是,从Java的角度来看,把API搞得一团糟,实现复杂度也很高。
他们的建议是在 OkHttp 之外处理这个问题,因此在您的情况下,首先以异步方式获取令牌,然后发起 HTTP 请求。
我希望这对以后看到的人有所帮助。您可以使用 runBlocking{ }
运行 身份验证器中的异步代码,这是专门设计用于将常规阻塞代码桥接到以挂起样式编写的库。
我正在尝试使用协程在改造中实现 JWT 令牌身份验证和刷新令牌。令牌存储在 Room 数据库中。我应该如何实现等待调用?
目前我正在使用 runBlocking {...} 调用来等待异步 local/remote 响应
示例:
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){...}
}
我该怎么办?
OkHttp 是一个 Java 库并使用同步请求拦截器。 Kotlin 的协程无法将同步代码转换为异步代码,它们只会让您已经异步的代码看起来像同步代码一样简单。 OkHttp 中已经有一个 feature request 可以专门启用您的要求,但被拒绝了。原因是,从Java的角度来看,把API搞得一团糟,实现复杂度也很高。
他们的建议是在 OkHttp 之外处理这个问题,因此在您的情况下,首先以异步方式获取令牌,然后发起 HTTP 请求。
我希望这对以后看到的人有所帮助。您可以使用 runBlocking{ }
运行 身份验证器中的异步代码,这是专门设计用于将常规阻塞代码桥接到以挂起样式编写的库。