Iris路由需显式调用app.Get()/Post()注册,路径参数必须用:name语法(非{name}),提取一律用ctx.Params().Get();混用ctx.URLParam()或ctx.FormValue()必为空。

直接说结论:Iris 的路由不是“配置出来”的,而是靠 app.Get()、app.Post() 这类方法**显式注册**,路径参数必须用 :name 语法,不能写成 {name};所有参数提取都依赖 ctx.Params().Get(),混用 ctx.URLParam() 或 ctx.FormValue() 必然取不到值。
怎么注册 GET/POST 路由才不报错
常见错误是把 app.Get("/user/{id}", handler) 当成标准写法——Iris 不识别花括号,只认冒号前缀。路径里出现 { 或 } 会直接 panic。
-
app.Get("/api/v1/user/:uid", handler)✅ 正确,:uid是命名参数 -
app.Post("/files/:name:path", handler)✅:name:path表示捕获多段路径,但必须放在末尾 -
app.Get("/static/*filepath", handler)✅ 通配符写法,用ctx.Params().Get("*filepath")取值 - 多个同路径不同方法可共存:
app.Get("/order/:id", read)和app.Put("/order/:id", update)不冲突
为什么 ctx.Param("id") 总是空?
因为 ctx.Param() 是别名,真正该用的是 ctx.Params().Get("id")。新手常误用 ctx.URLParam("id")(查 query string)或 ctx.FormValue("id")(查表单),这两者对路径参数完全无效。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 路由定义为
/user/:id,请求是GET /user/123→ 用ctx.Params().Get("id")得到"123" - 拼错参数名,比如路由写
:uid却调ctx.Params().Get("id")→ 返回空字符串,不 panic,容易漏判 - 需要强类型转换时,优先用
ctx.Params().GetInt64("id"),比手动strconv.ParseInt()更安全
如何让路由自动校验参数类型
不加类型标注的 :id 默认当 string 处理,后续调 GetInt() 必然失败。必须显式声明类型,Iris 才会在匹配阶段做格式拦截。
-
/user/:id:int→ 只匹配纯数字,/user/abc直接 404,handler 不执行 -
/post/:year:int/:month:uint→ 支持连续多个带类型的参数,大小写敏感 -
/file/:name:alphanumeric→ 限制只能是字母、数字、下划线、短横线 - 自定义范围控制:注册
min(1)宏后,写/order/:oid:int min(1),/order/0就不会进 handler
404 页面为什么总不生效
八成是因为 app.OnErrorCode(iris.StatusNotFound, handler) 写在了所有路由注册之后,或者被泛匹配路由挡在前面。
- 必须在
app := iris.New()后立即注册,早于任何app.Get()、app.Post() - 泛匹配路由如
app.Get("/{any:path}", fallback)必须放在最后,否则它会吞掉所有未命中请求,OnErrorCode彻底失效 - 静态文件服务(
app.StaticWeb())下缺失文件,不会触发OnErrorCode,得单独处理 - 传参要用
iris.StatusNotFound常量,不能写404字面量,类型不匹配就静默忽略
最容易被忽略的一点:Iris 没有“自动启动”这回事——app.Get() 写完不调 app.Listen() 或 app.Run(),整个路由表就是个摆设,服务压根没跑起来。


















