Iris动态路由必须用{param}或{param:type}格式,禁用:id等其他风格;类型约束如{id:int}可自动404非法值;取参须用ctx.Params().GetInt()等类型安全方法,不可仅Get()后强转。

动态路由参数怎么写才不 404
Iris 的动态路由必须用 {param} 或带类型的 {param:int} 形式,不能写成 :id 或 $name——这是 Express 或 Gin 风格,Iris 不识别。路径中只要出现未声明的变量(比如写了 /user/:id),匹配时直接 404,不会报错提示。
-
{id}等价于{id:string},接受任意非空字符串 -
{id:int}要求必须是整数,否则自动返回 404(无需手动校验) -
{tenant:alphabetical}只允许字母,{file:file}允许字母/数字/下划线/点/短横 - 多个参数可并存:
/api/{version:string}/{resource:alphabetical}/{id:int} - 路径末尾用
{path:path}捕获剩余所有段,如/static/{file:path}匹配/static/css/app.css
如何在 handler 里安全取参数值
不能直接用 ctx.Params().Get("id") 后强转,因为 Get() 返回 string,而 GetInt() 等方法会返回 (int, error)。如果路由定义了 {id:int},但你在 handler 里仍调用 Get(),就失去了类型约束优势。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 优先用类型安全方法:
id, err := ctx.Params().GetInt("id"),err != nil表示解析失败(理论上不该发生,除非宏注册异常) - 有默认值场景用
GetIntDefault("id", 1),避免 if-else - 布尔值用
GetBool(),注意它识别"1"/"true"/"0"/"false"等多种写法 - 不要在
BeforeActivation或构造函数里取参数——那时ctx还不存在
带约束的动态路由怎么加 min/max
Iris 支持在类型后链式追加约束函数,比如 {id:int min(1) max(999)},但这些函数必须提前注册,否则运行时报 panic:“macro function 'min' not registered”。官方内置了 min、max、range 等,但没开箱即用,得手动挂载。
- 全局注册一次即可,在
main()初始化阶段:app.Macros().Int.RegisterFunc("min", func(n int) func(int) bool { return func(v int) bool { return v >= n } }) - 约束只对匹配成功的参数生效;若参数本身不是 int(比如传了
abc),根本进不到约束校验,直接 404 - 自定义约束函数返回的是
func(int) bool,不是直接返回布尔值 - 路径里写
{id:int min(1)},handler 中仍需调用GetInt()才触发约束检查
为什么路由匹配了却拿不到参数
最常见原因是 handler 签名或调用方式错误:MVC 控制器里没用 By 标签接收参数,或普通 handler 没从 ctx.Params() 显式读取。Iris 不会自动注入参数到函数形参,也不支持结构体绑定(像 Gin 的 Bind)。
- MVC 场景下,控制器方法必须带对应字段和
By标签:func (c *UserController) GetProfile(ByID int) { ... } - 普通 handler 必须主动调用:
id := ctx.Params().GetIntDefault("id", 0) - 别名路由(
app.Get("/u/{id}", h, "user.profile"))不影响参数获取逻辑,该读还是得读 - 如果用了
Party()分组,路径拼接后参数名不变,仍是原始定义里的名字,不是分组前缀的一部分


















