我正在构建一个API,并使用intercept(ApplicationCallPipeline.Call){}
在每次执行路由之前运行一些逻辑。我需要将数据从intercept()方法传递到调用的路由,然后
我正在使用intercept()中的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
我想知道做事是否正确
最佳答案
这是再现您描述内容的最简单的代码:
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版本以及哪个引擎?
关于kotlin - 如何在Ktor(Kotlin)中的管道的各个部分之间传递数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51271993/