如何在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
相关产品推荐
相关产品推荐

