Iris 必须显式调用 Run() 或 Listen() 才启动服务,否则路由注册无效;路径参数需用 ctx.Params().Get() 获取;中间件响应后必须调用 ctx.StopExecution() 阻止后续执行;模板路径须用 iris.Dir() 包裹且与实际结构一致。

app.Get() 之后必须调用 Listen() 或 Run() 启动服务
写完 app.Get() 路由却访问不到?大概率是服务根本没跑起来。Iris 不会自动监听端口,iris.New() 只创建实例,不启动 HTTP server。
常见错误现象:终端无日志、进程秒退、浏览器请求超时或直接拒绝连接。
- 开发阶段用
app.Listen(":8080")最快上手 - v12+ 推荐用
app.Run(iris.Addr(":8080")),支持传入iris.Configuration控制超时、TLS 等 - 若用了
iris.TLS()或自定义http.Server,必须用ConfigureHost(),否则配置无效
路径参数要用 ctx.Params().Get(),不是 ctx.URLParam()
ctx.URLParam("id") 是取 ?id=123 这类查询参数;而 RESTful 路径如 /user/123 中的 123,必须走 ctx.Params().Get("id")。
拼错参数名(比如路由写 {id} 却调用 ctx.Params().Get("ID"))会返回空字符串,不 panic —— 容易漏掉校验,导致后续逻辑出错。
- 安全做法:用带类型转换的方法,如
ctx.Params().GetInt64("id"),失败时err != nil,必须检查 - 更省心:在路由里加宏类型,如
/user/{id:uint64},匹配失败直接 404,此时GetUint64("id")必然成功,可跳过err判断 - 大小写敏感,
Get("Id")和Get("id")是两个不同参数
动态路径段整体捕获要写 {name:path} 且放末尾
想捕获 /files/a/b/c.txt 中的完整子路径 a/b/c.txt,不能靠多个 {part} 拆分,得用 {path:path} 类型。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
注意两点硬约束:一是 {path:path} 必须放在路径最末尾,二是前面不能紧挨着斜杠,比如 /files/{name:path}/meta 是非法的。
- 获取值仍用
ctx.Params().Get("name"),但返回的是原始 URL 编码字符串(如a%20b.txt) - Iris 不自动解码,需手动调用
url.PathUnescape(),否则空格、斜杠等会被误判 - 该参数不会参与路由匹配优先级计算,仅作兜底捕获,适合文件托管、静态资源代理等场景
状态码和 JSON 响应要分开设置
Iris 控制器方法或 handler 的返回值默认只做响应体序列化,状态码始终是 200。要返回 201 Created 或 404 Not Found,必须显式调用 ctx.StatusCode()。
别指望返回结构体或 error 类型能自动推断状态码 —— Iris 不做这层猜测。
- 正确顺序:
ctx.StatusCode(iris.StatusCreated)→ctx.JSON(data) - 如果先
JSON()再StatusCode(),部分客户端可能已读取响应头,状态码失效 - 对错误响应,建议统一用
ctx.StatusCode()+ctx.JSON(iris.Map{"error": "xxx"}),避免混用WriteString()导致 Content-Type 不一致
最容易被忽略的是:路由宏(如 {id:int min(1)})在匹配阶段就过滤非法请求,它不进 handler,也就不会触发任何日志或中间件逻辑。调试时如果发现某些请求“静默 404”,先查路由定义里的宏是否太严。










