1

我正在构建一个 API 并intercept(ApplicationCallPipeline.Call){}用于在每次路由执行之前运行一些逻辑。我需要将数据从拦截()方法传递给被调用的路由,并通过call.attributes.put()在拦截()中使用来设置数据,如下所示:

val userKey= AttributeKey<User>("userK") call.attributes.put(userKey, userData)

并使用检索userDatacall.attributes[userKey]。发生的情况是,call.attributes[userKey]这只适用于我设置了属性的拦截()方法。它在我需要它的路线上不起作用。它把我扔了 java.lang.IllegalStateException: No instance for key AttributeKey: userK

我想知道是否以正确的方式做事

4

1 回答 1

5

这是重现您描述的最简单的代码:

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 版本以及哪个引擎?

于 2018-07-11T11:38:29.883 回答