You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ktor嵌套路由的route()内部访问路径参数?

Ktor嵌套路由中父层级路径参数的访问方法

完全可以在你标注的父路由层级获取param1,以下是两种实用的实现方式:

方式一:通过路由拦截器获取

在父路由块内添加拦截器,在请求处理流程中提前获取参数,所有子路由的请求都会先执行这段逻辑:

routing {
    route("/order") {
        route("/shipment/{param1}") { 
            intercept(ApplicationCallPipeline.Call) {
                val param1 = call.parameters["param1"]
                // 这里可以对param1做验证、日志记录等操作
                println("获取到param1: $param1")
                proceed() // 继续执行后续子路由的处理逻辑
            }
            
            get("/sample/{param2}") {
                // 子路由业务逻辑
            }
            post("/sample/{param2}") {
                // 子路由业务逻辑
            }
        }
    }
}

方式二:存入请求属性供全局使用

如果需要在后续子路由中复用param1,可以把参数存入请求的属性中,方便后续直接取用:

// 定义一个属性键,用于存储param1
val Param1AttributeKey = AttributeKey<String>("Param1")

routing {
    route("/order") {
        route("/shipment/{param1}") { 
            intercept(ApplicationCallPipeline.Call) {
                call.parameters["param1"]?.let {
                    call.attributes.put(Param1AttributeKey, it)
                }
                proceed()
            }
            
            get("/sample/{param2}") {
                // 子路由中直接从属性获取param1
                val param1 = call.attributes[Param1AttributeKey]
            }
        }
    }
}

注意:不能直接在route块的顶层(非拦截器、非请求处理块)调用call.parameters,因为此时还未进入请求上下文,只有在拦截器或get/post这类请求处理逻辑中才能访问call对象。

内容的提问来源于stack exchange,提问作者Anandakrishnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:24:33