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

时间:2019-03-27 09:01:26

标签: kotlin kotlin-coroutines ktor

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

我的问题是我需要从服务级别的类访问call对象。在Spring中,您可以通过访问SecurityContext来访问ThreadLocal来进行此操作。协程驱动的Ktor没有这种选择。

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

1 个答案:

答案 0 :(得分:0)

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

我写了一个实现该行为的Ktor功能。 答案是很难用几句话来形容。

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

=> 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"
}

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