如何在 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.3Netty 那么你必须展示更多的代码,这样我们才能看到你在做什么。我的示例有效,因此您的代码可能存在问题。 事实上我定义了 val userKey = AttributeKey("userK") 两次。首先在intercept() 中,然后在希望它们指向同一个键的路由中。谢谢@andreas-volkmann @AndreasVolkmann 先生,对不起,我在这里发表评论,我读了你的好文章andreasvolkmann.github.io/posts/2018-04-27-m3u8-and-ts-segments。我是 Kotlin 和加密的新手。直到上个月,我一直试图在 kotlin 中找到 AES-128 加密的解决方案。但我没有找到任何解决方案。我的问题在这里***.com/questions/60220798/…

以上是关于如何在 Ktor (Kotlin) 中管道的各个部分之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Multiplatform Mobile:Ktor - 如何在 Kotlin Native(iOS)中取消活动协程(网络请求、后台工作)?

如何使用 ktor kotlin 通过 POST 发送 JSON 字符串?

如何修复 io.ktor.server.engine.CommandLineKt 在 gradle/kotlin/netty 项目中抛出的“既未指定端口也未指定 sslPort”?

Kotlin:Ktor 如何将文本响应为 html

如何保持 Kotlin Ktor websocket 处于打开状态

如何使用内容协商将 json 转换为 ktor 中的 kotlin 对象?