如何在ktor中动态设置表头列表


@Dao
interface TokenDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertToken(token: TokenEntity): Long
@Query("SELECT * FROM token WHERE id = :id")
suspend fun getTokenInfo(id: String): TokenEntity
}   

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

private val json = Json {
encodeDefaults = true
ignoreUnknownKeys = true
}

@OptIn(InternalAPI::class)
@Singleton
@Provides
fun provideKtorHttpClient(
tokenRepository: TokenRepository,
tokenDao: TokenDao
): HttpClient {
return HttpClient(OkHttp) {
//Json Setting
install(JsonFeature) {
serializer = KotlinxSerializer(json = json)
}
//Logging Setting
install(Logging) {
logger = object : Logger {
override fun log(message: String) {
Timber.d("api log: $message")
}
}
logger = Logger.DEFAULT
level = LogLevel.ALL
}
//Timeout Setting
install(HttpTimeout) {
requestTimeoutMillis = 15_000
connectTimeoutMillis = 15_000
socketTimeoutMillis = 15_000
}

//Default Request Setting
defaultRequest {
contentType(ContentType.Application.Json)
accept(ContentType.Application.Json)
headers {
append("Accept-Version", "v1")
CoroutineScope(Main).launch {
val authToken = tokenDao.getTokenInfo("auth_token")
authToken?.let {
append(HttpHeaders.Authorization, authToken.token)
}
}
}
url {
protocol = URLProtocol.HTTP
host = Constants.BASE_URL
}
}
}
}

当向后端服务器发送请求时,如果房间中存储了一个值,请将其放入标头的授权中,然后如果没有值,尽量不要发送。因此,如果我用CorutineScope调用房间中的值,并且如果值为空,直接跳过但是,尽管有一个值,但标头不包括该值。当使用Ktor时,我应该如何实现根据标头值中是否存在令牌进行自动化的部分?

Ktor不是一个固执己见的web客户端。

在客户端构建器上动态设置头与拥有两个客户端实例一样有效,一个具有身份验证,另一个没有身份验证

从你粘贴的代码来看,我相信不那么复杂的事情可能是始终提供一个未经验证的客户端,并在请求需要发出时设置标头,但这实际上取决于你的

最新更新