小编gpu*_*nto的帖子

在 Ktor 客户端中重新触发 loadTokens 的正确方法

在我的移动应用程序中,我有一个单例 Ktor HttpClient,其不记名身份验证配置如下:

\n
HttpClient(\xe2\x80\xa6) {\n    install(Auth) {\n        bearer {\n            sendWithoutRequest { requestBuilder -> some condition }\n            loadTokens(tokensStorage::getTokens)\n            refreshTokens {\n                performTokenRefresh(oldTokens.refreshToken)\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

现在考虑以下流程:

\n
    \n
  1. 用户打开应用程序,而 my 中存储的令牌tokenStorage无效。
  2. \n
  3. 从中加载HttpClient令牌tokenStorage,请求失败并返回 401。
  4. \n
  5. 尝试HttpClient执行刷新,但也失败,因为刷新令牌无效。
  6. \n
  7. 用户被重定向到登录页面,登录,新的有效令牌存储在tokenStorage.
  8. \n
  9. 现在,用户可以从应用程序重试第 2-3 点中失败的呼叫。然而,这将永远失败,直到应用程序关闭,因为它HttpClient不再尝试调用loadTokens。确实,从源代码来看,loadTokens只被调用一次,然后就不会再被调用。
  10. \n
\n

我找到了解决该问题的几种方法。

\n

第一个是手动BearerAuthProviderHttpClient自己清除令牌,如以下代码片段所示,但这似乎是一种黑客解决方法:

\n
httpClient.plugin(Auth).providers\n    .filterIsInstance<BearerAuthProvider>()\n    .first().clearToken()\n
Run Code Online (Sandbox Code Playgroud)\n

tokenStorage另一种方法是从 my in手动加载当前令牌refreshToken并忽略传入的内容this@refreshTokens.oldTokens …

kotlin ktor ktor-client

14
推荐指数
0
解决办法
1521
查看次数

多模块项目:如何设置 Dagger 来提供接口但隐藏特定于实现的依赖项?

在我的应用程序中,我有两个模块:apprepository
repository依赖于 Room,并且有一个GoalRepository接口:

interface GoalRepository
Run Code Online (Sandbox Code Playgroud)

和一个GoalRepositoryImpl内部类,因为我不想将它或 Room 依赖项暴露给其他模块

@Singleton
internal class GoalRepositoryImpl @Inject constructor(private val dao: GoalDao) : GoalRepository
Run Code Online (Sandbox Code Playgroud)

app取决于repository获取一个GoalRepository实例。目前,
我有一个:GoalRepositoryModule

@Module
class GoalRepositoryModule {
    @Provides
    @Singleton
    fun provideRepository(impl: GoalRepositoryImpl): GoalRepository = impl

    @Provides
    @Singleton
    internal fun provideGoalDao(appDatabase: AppDatabase): GoalDao = appDatabase.goalDao()

    @Provides
    @Singleton
    internal fun provideDatabase(context: Context): AppDatabase =
        Room.databaseBuilder(context, AppDatabase::class.java, "inprogress-db").build()
}
Run Code Online (Sandbox Code Playgroud)

问题是这不会编译(显然),因为公共provideRepository函数正在公开GoalRepositoryImpl,即一个internal类。
如何构建我的 Dagger …

android modularization dagger dagger-2 android-module

5
推荐指数
1
解决办法
2248
查看次数