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

Posted

技术标签:

【中文标题】如何使请求绑定的数据在 Ktor 中全局可用?【英文标题】:How to make request-bound data globally available in Ktor? 【发布时间】:2019-08-17 18:54:24 【问题描述】:

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

我的问题是我需要从服务级别类访问call 对象。在 Spring 中,您可以通过访问 SecurityContext 来完成此操作,该 ThreadLocal 可在全球范围内使用。 Ktor 是协程驱动的,没有这个选项。

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

【问题讨论】:

值得一提的是,协程确实有一个CoroutineContext,它基本上只是一张地图。 CoroutineContext 的问题在于它很容易一路丢失(例如调用async 时)。在所有这些地方,协程上下文必须显式传递,这很容易忘记(编译器不会抱怨)。但我确实同意,在一定的纪律下,这是一个解决方案。 对于将来看到这一点的任何人,我已经在这里询问/回答了有关如何实现协程上下文的问题:***.com/questions/63674112/… 【参考方案1】:

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

我编写了一个 Ktor-Feature 来实现该行为。 答案很复杂,用几句话来形容。

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

=> https://github.com/MaaxGr/ktor-globalcalldata


这是一个简短的 sn-p,我的 dsl 的样子:

从路由中直接或间接调用挂起函数 test():

routing 
    get("/test") 
        test()
        call.respond("OK")
    

通过callData().call访问调用对象

suspend fun test() 
    val url = callData().call.request.uri
    println(url) // prints "/test"

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

【讨论】:

以上是关于如何使请求绑定的数据在 Ktor 中全局可用?的主要内容,如果未能解决你的问题,请参考以下文章

使 Vue 数据对所有组件全局可用和可访问

在 Vue JS 中,如何使我的 APIService.js 类对组件全局可用,而不需要单独的组件来导入它?

lighttpd 没有使全局环境变量对可执行文件可用

Grails - 使方法全局可用和元类编程

如何构造循环API调用以使JSON结果可用?

如何使大量现有函数在一个类的范围内可用?