【问题标题】:Adding interceptor to routes in Ktor not working在 Ktor 中向路由添加拦截器不起作用
【发布时间】:2022-01-13 15:55:07
【问题描述】:

我有一个Route,对于每个ApplicationCall,我想在响应中添加一个标头。

例如

routes {
   route("/cdn-cached") {
        intercept(ApplicationCallPipeline.Features){
           call.response.header(HttpHeaders.CacheControl, ...)
        }
        

        get(...) {...}
        post(...) {...}
        route(...) {...}
   }
}

这是我设置的一个过于简单的示例,但我期望的是,每次我调用 /cdn-cached 路由下的端点时,它都会附加标头。我确定我搞砸了,但我不知道是什么。

我需要什么来修复此代码?

注意:我有一个框架可以做很多动态的事情,到目前为止它可以做我想做的一切,现在我偶然发现了这个。我之所以这么说,是因为在每个 ApplicationCall 中添加标题对我来说不是一个好选择,比如这里的 get、post 和 route。我可以这样做,但如果我可以像我在示例中描述的那样做的话,我宁愿不这样做。

【问题讨论】:

    标签: kotlin ktor


    【解决方案1】:

    你可以拦截ApplicationCallPipeline.Call阶段来影响当前路由及其子路由:

    route("/cdn-cached") {
        intercept(ApplicationCallPipeline.Call) {
            call.response.header("custom", "123")
        }
    
        // ...
    }
    

    【讨论】:

    • 谢谢!这似乎可以解决问题,但是在文档中它说像我这样的东西应该可以工作:ktor.io/docs/… 或者我误解了什么?
    • 我已经更新了答案。无需拦截所有子路由。
    • 这很奇怪,它可以在正常设置下工作,但在我的框架中,当我动态添加它时却不行。
    猜你喜欢
    • 2019-10-20
    • 2021-06-21
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多