如何在 Ktor (Kotlin) 中管道的各个部分之间传递数据
Posted
技术标签:
【中文标题】如何在 Ktor (Kotlin) 中管道的各个部分之间传递数据【英文标题】:How to pass data between various parts of the pipeline in Ktor (Kotlin) 【发布时间】:2018-12-18 16:46:12 【问题描述】:我正在构建一个 API 并使用 intercept(ApplicationCallPipeline.Call)
在每次路由执行之前运行一些逻辑。我需要将数据从拦截()方法传递到被调用的路由和
我在拦截()中使用call.attributes.put()
设置数据,如下所示:
val userKey= AttributeKey<User>("userK")
call.attributes.put(userKey, userData)
并使用 call.attributes[userKey]
检索 userData。
发生的情况是 call.attributes[userKey]
仅适用于我设置了属性的 intercept() 方法。它在我需要它的路线上不起作用。
它把我扔了
java.lang.IllegalStateException: No instance for key AttributeKey: userK
我想知道我是否以正确的方式做事
【问题讨论】:
【参考方案1】:这是重现您描述的最简单的代码:
class KtorTest
data class User(val name: String)
private val userKey = AttributeKey<User>("userK")
private val expected = "expected name"
private val module = fun Application.()
install(Routing)
intercept(ApplicationCallPipeline.Call)
println("intercept")
call.attributes.put(userKey, User(expected))
get
println("call")
val user = call.attributes[userKey]
call.respond(user.name)
@Test fun `pass data`()
withTestApplication(module)
handleRequest .response.content.shouldNotBeNull() shouldBeEqualTo expected
我拦截调用,把用户放在属性中,最后在get请求中用用户响应。 测试通过。
您使用的是什么 ktor 版本以及哪个引擎?
【讨论】:
我正在使用 ktor 0.9.3 和 Netty 那么你必须展示更多的代码,这样我们才能看到你在做什么。我的示例有效,因此您的代码可能存在问题。 事实上我定义了 val userKey = AttributeKey以上是关于如何在 Ktor (Kotlin) 中管道的各个部分之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin Multiplatform Mobile:Ktor - 如何在 Kotlin Native(iOS)中取消活动协程(网络请求、后台工作)?
如何使用 ktor kotlin 通过 POST 发送 JSON 字符串?
如何修复 io.ktor.server.engine.CommandLineKt 在 gradle/kotlin/netty 项目中抛出的“既未指定端口也未指定 sslPort”?