Passing information among interceptors

预计阅读时间:2分钟

Ktor提供了一个Attributes类,该类充当小型实例容器/依赖注入器.

对于服务器, ApplicationCall包含一个attributes属性,其中包括此类的实例( call.attributes ). 该容器的生命周期为调用:从请求开始时开始,在响应发送后结束.

您可以在拦截器上为每个调用设置所需数量的属性,然后在另一个拦截器中检索它们.

对于客户端, HttpRequest还包含一个attributes属性. 因此,从HttpClientCall实例,您可以使用call.request.attributes访问属性.

Basic usage

可以通过创建AttributeKey类的实例来定义自己的类型化属性,如下所示:

// Declared as a global property
val MyAttributeKey = AttributeKey<Int>("MyAttributeKey")

您以后可以使用以下方法设置属性:

attributes.put(MyAttributeKey, 10)

并通过调用以下命令在另一个拦截器中检索它们:

attributes.get(MyAttributeKey)

API reference

此类的完整接口如下:

interface Attributes {
    operator fun <T : Any> get(key: AttributeKey<T>): T
    fun <T : Any> getOrNull(key: AttributeKey<T>): T?
    operator fun contains(key: AttributeKey<*>): Boolean
    fun <T : Any> put(key: AttributeKey<T>, value: T)
    fun <T : Any> remove(key: AttributeKey<T>)
    fun <T : Any> take(key: AttributeKey<T>): T = get(key).also { remove(key) }
    fun <T : Any> takeOrNull(key: AttributeKey<T>): T? = getOrNull(key).also { remove(key) }
    fun <T : Any> computeIfAbsent(key: AttributeKey<T>, block: () -> T): T
    val allKeys: List<AttributeKey<*>>
}

by  ICOPY.SITE