我创建了一个自定义插件来为 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)
}
HeadersBuilder.remove
方法从特定请求中删除标头:
val client = HttpClient(CIO)
client.get("https://example.com") {
headers.remove("AUTHTOKEN")
}