Iris路由需显式启动、正确提取参数并匹配路径规则,缺一不可。必须调用Listen()或Run()启动服务;路径参数用ctx.Params().Get()而非URLParam();OPTIONS预检请求须手动注册。

Iris 的路由不是“配完就能用”的黑盒,它依赖显式启动、参数提取逻辑与路径匹配规则三者协同;漏掉任一环节,请求就会静默失败或取不到参数。
Listen() 或 Run() 必须显式调用,否则服务根本没起来
很多人写完 app := iris.New() 和路由注册,就直接 go run main.go,终端没报错、浏览器打不开、进程还退出了——不是代码有 bug,是 HTTP server 根本没启动。
-
iris.New()只创建应用实例,不监听端口;必须紧接着调用.Listen(":8080")(旧习惯)或更推荐的.Run(iris.Addr(":8080"))(v12+ 官方推荐) - 如果用了 TLS(如
iris.TLS("cert.pem", "key.pem")),必须用.ConfigureHost(),.Run()会忽略 TLS 配置 - 常见错误现象:
go run后终端立刻返回命令行(进程退出),或阻塞但 curlhttp://localhost:8080超时 —— 先检查是否漏了启动调用
路径参数用 ctx.Params().Get(),别和 URL 查询参数混淆
ctx.URLParam("id") 是取 ?id=123 这种查询字符串,ctx.Params().Get("id") 才是取 /user/{id:uint64} 中的路径段。新手在这儿栽跟头最多,结果 handler 里拿到空字符串,还以为路由没匹配上。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- RESTful 路由如
app.Get("/user/{id:uint64}", handler)→ 必须用ctx.Params().Get("id")或带类型转换的ctx.Params().GetInt64("id") - 参数名大小写敏感:路由定义是
{id},但写了ctx.Params().Get("ID"),返回空字符串,不 panic,容易漏校验 -
ctx.Params()不做默认值兜底:路径缺参数(比如只访问/user/而非/user/123),路由根本不匹配,handler 压根不会执行
可选参数得靠多条路由 + handler 内判断,不是语法糖能解决的
Iris 不支持 {id:uint64?} 这类可选语法,也没 ctx.Params().GetDefault() 方法。所谓“默认值”,只能靠注册多个路由 + 在 handler 里统一 fallback。
- 正确做法:注册两条路由,覆盖同一逻辑入口
app.Get("/user", userHandler)app.Get("/user/{id:uint64}", userHandler) - 在
userHandler里先判空:if ctx.Params().Get("id") == "" { id = 1 } else { id, _ = strconv.ParseUint(...) } - 别混用
ctx.URLParam()模拟默认值,比如允许/user?id=123,这会让接口语义模糊,且绕过{id:uint64}的宏校验,导致后续解析 panic
OPTIONS 预检请求必须显式注册,CORS 中间件不会自动生效
Iris 不会自动捕获或响应 OPTIONS 请求。如果你前端发了带 credentials 或自定义 header 的请求,浏览器先发预检,而你没注册 OPTIONS 路由,就会卡在 Response to preflight request doesn't pass access control check。
- 必须显式注册:比如全局加
app.Options("*", func(ctx iris.Context) { ctx.StatusCode(204) }),或按分组加api.Options("/users/*", ...) - CORS 头要成套写全:
Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers缺一不可 - 若启用了 credentials(如前端设
credentials: 'include'),Access-Control-Allow-Origin不能为"*",必须指定具体 origin,比如"http://localhost:3000"
最常被跳过的其实是路由匹配前的“启动”和“预检”两步——它们不报错,但让整个流程静默失效。写完路由别急着测业务逻辑,先 curl -X OPTIONS 看预检通不通,再确认 .Run() 是否真在执行。










