如何使请求绑定的数据在 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 中全局可用?的主要内容,如果未能解决你的问题,请参考以下文章