我正在Ktor中构建一个微服务。当我们在应用程序模块中工作时,Ktor 提供对包含授权数据的 call
对象的访问。
我的问题是我需要从服务级别类访问call
对象。在 Spring 中,您可以通过访问全球可用的SecurityContext
来执行此操作 ThreadLocal
.Ktor 是协程驱动的,没有这个选项。
我是否真的需要通过我的服务层方法传递call
对象,或者 Ktor 中有没有办法拥有某种可以从任何地方访问的"调用上下文"对象?
我认为目前没有内置的官方机会。
我编写了一个 Ktor-Feature,它实现了这种行为。答案是用几句话来描述它很复杂。
如果您有兴趣,请查看代码 + 示例。还提供了安装指南。
=> https://github.com/MaaxGr/ktor-globalcalldata
<小时 />这里有一个简短的片段,我的dsl看起来像:
从路由直接或间接调用挂起函数 test((:
routing {
get("/test") {
test()
call.respond("OK")
}
}
通过callData().call
访问调用对象
suspend fun test() {
val url = callData().call.request.uri
println(url) // prints "/test"
}
该库还允许添加可绑定到当前协程/调用的自定义属性。