我正在构建一个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/

10-13 04:12