如何使用 KTOR 中特定 API 请求的插件删除标头集

问题描述 投票:0回答:1

我创建了一个自定义插件来为 ktor 中的请求设置标头

internal fun headersPlugin(defaultHeaders: DefaultHeaders) = createClientPlugin("headersPlugin") {
    onRequest { request, _ ->
        request.headers.apply {
            append("requestFrom", defaultHeaders.requestFrom)
            append("clientType", defaultHeaders.clientType)
            append("User-Agent", defaultHeaders.userAgent)
            append("AUTHTOKEN", defaultHeaders.authToken)
            append("SESSIONID", defaultHeaders.sessionId)
        }
    }
}

现在我想删除

AUTHTOKEN
中的特殊 API 请求

fun getApiClient(): HttpClient = httpClient { defaultRequest { /* logic to remove AUTHTOKEN header by checking some annotation or something when a purticular API request is annotated or some variable to check */ } /* Logging */ install(Logging) { logger = object : Logger { override fun log(message: String) { Napier.v("HTTP Client", null, message) } } level = LogLevel.ALL } }.also { Napier.base(DebugAntilog()) }
我已经使用了 Retrofit,并且正在尝试迁移到 KTOR 

在改造中,我使用

@IGNORE

 注释对服务类中的方法进行注释,并在拦截器中检查忽略注释并删除标头(如果存在)

val tag: Invocation? = request.tag(Invocation::class.java) val method: Method? = tag?.method() builder .addHeader("requestFrom", networkUtil.requestFrom) .addHeader("clientType", "17") .addHeader("User-Agent", networkUtil.userAgentInfo) .addHeader("AUTHTOKEN", networkUtil.authKey) .addHeader("SESSIONID", networkUtil.sessionId) method?.also { it.getAnnotation(Ignore::class.java)?.run { if (this.keyName.contains(Ignore.AUTH_TOKEN)) { builder.removeHeader("AUTHTOKEN") } if (!this.keyName.contains(Ignore.BASE_URL)) { builder.url(reformedUrl) } if (this.keyName.contains(Ignore.SESSION_ID) || networkUtil.sessionId.isEmpty()) { builder.removeHeader("SESSIONID") } } ?: run { builder.url(reformedUrl) }
    
android retrofit ktor ktor-client
1个回答
0
投票
您可以使用

HeadersBuilder.remove

 方法从特定请求中删除标头:

val client = HttpClient(CIO) client.get("https://example.com") { headers.remove("AUTHTOKEN") }
    
© www.soinside.com 2019 - 2024. All rights reserved.