Kotlin 如何使请求绑定数据在Ktor中全局可用?

Kotlin 如何使请求绑定数据在Ktor中全局可用?,kotlin,kotlin-coroutines,ktor,Kotlin,Kotlin Coroutines,Ktor,我正在Ktor建立一个微型服务。当我们在应用程序模块中工作时,Ktor提供了对调用对象的访问,该对象包含授权数据 我的问题是我需要从服务级别类访问调用对象。在Spring中,您可以通过访问SecurityContext来实现这一点,该文本可通过ThreadLocal全局访问。Ktor是协同程序驱动的,没有这个选项 我真的需要通过我的服务层方法传递调用对象吗,或者在Ktor中有没有一种方法可以让您从任何地方访问某种“调用上下文”对象?我认为目前没有内置的官方机会 我已经编写了一个Ktor特性,它实

我正在Ktor建立一个微型服务。当我们在应用程序模块中工作时,Ktor提供了对
调用
对象的访问,该对象包含授权数据

我的问题是我需要从服务级别类访问
调用
对象。在Spring中,您可以通过访问
SecurityContext
来实现这一点,该文本可通过
ThreadLocal
全局访问。Ktor是协同程序驱动的,没有这个选项


我真的需要通过我的服务层方法传递
调用
对象吗,或者在Ktor中有没有一种方法可以让您从任何地方访问某种“调用上下文”对象?

我认为目前没有内置的官方机会

我已经编写了一个Ktor特性,它实现了这种行为。 答案很难用几句话来描述

如果您感兴趣,请查看代码+示例。还提供了安装指南

=>


下面是一个简短的片段,我的dsl是什么样子的: 直接或间接从路由调用挂起函数test():

路由{
获取(“/test”){
测试()
打电话。回复(“OK”)
}
}
通过
callData()访问调用对象。调用

suspend-fun测试(){
val url=callData().call.request.uri
println(url)//打印“/测试”
}

该库还允许添加可绑定到当前协同路由/调用的自定义属性。

值得一提的是,协同路由确实有一个基本上只是一个映射的属性。
CoroutineContext
的问题是,在调用
async
的过程中很容易丢失它。在所有这些地方,必须显式地传递协程上下文,这很容易忘记(编译器不会抱怨)。但我确实同意,根据一些原则,这是一个解决方案。对于将来看到这一点的任何人,我在这里提出/回答了一个关于如何实现协同程序上下文的问题: