Iris路由用app.Get()/Post()注册,路径支持:name参数和*通配符;参数提取需匹配来源(URLParam/FormValue/ReadJSON);JSON响应用ctx.JSON()但需手动设Content-Type;中间件必须显式调用ctx.Next()才能继续执行。

如何定义 Iris 的 GET/POST 路由
Iris 使用 app.Get()、app.Post() 等方法注册路由,和大多数 Go Web 框架类似,但语法更紧凑。路由路径支持命名参数(:param)和通配符(*),不支持正则内联写法(如 /user/:id([0-9]+) 会报错)。
常见错误:把 app.Get("/user/:id", handler) 写成 app.Get("/user/{id}", handler) —— Iris 不识别花括号风格,只认冒号前缀。
- 命名参数必须用
:name,例如/api/v1/user/:uid - 通配符用
*,如/static/*filepath,匹配后可通过ctx.Params().Get("*filepath")获取 - 多个同路径不同方法的路由可共存,Iris 自动按 HTTP 方法分发
- 如果 handler 返回
nil,Iris 默认返回 200;显式调用ctx.StatusCode(404)才会真正返回 404
如何从请求中提取参数(Query、Form、JSON)
Iris 提供统一的 ctx 对象来读取各类输入,但不同来源需调用不同方法,混用会导致空值或 panic。
典型问题:用 ctx.FormValue("name") 读 JSON 请求体,结果始终为空 —— 因为 FormValue 只解析 application/x-www-form-urlencoded 和 multipart/form-data,不处理 JSON。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- Query 参数:用
ctx.URLParam("q")或ctx.Request().URL.Query().Get("q") - 表单数据:用
ctx.FormValue("field")(自动解析ParseMultipartForm) - JSON 请求体:先调用
ctx.ReadJSON(&v),否则ctx.FormValue和ctx.URLParam都拿不到字段 - 路径参数:用
ctx.Params().Get("uid"),注意和 Query 参数名不要冲突
如何正确返回 JSON 响应
Iris 的 ctx.JSON() 是最常用响应方式,但它默认不设置 Content-Type: application/json; charset=UTF-8,某些旧版客户端可能解析失败;另外它会忽略 struct 字段的 json:"-" 标签,但不会跳过零值字段(除非加 omitempty)。
容易踩的坑:直接 ctx.JSON(200, map[string]interface{}{"data": nil}),结果返回 {"data":null},而非省略该 key —— 这是 Go 原生 json.Marshal 行为,Iris 不做额外过滤。
- 推荐用结构体 +
json:"field,omitempty"控制输出 - 若需强制 UTF-8 声明,手动加
ctx.Header("Content-Type", "application/json; charset=UTF-8")再调用ctx.JSON() - 不要在
ctx.JSON()后再调用ctx.WriteString(),后者会覆盖前者并触发重复写入 panic - 大对象建议用
ctx.JSON(200, data)而非ctx.Writef("%s", b),避免手动序列化和编码错误
为什么中间件里 ctx.Next() 必须显式调用
Iris 的中间件是洋葱模型,但不像 Express 或 Gin 那样自动流转。如果你写了 app.Use(mw),但在 mw 函数里没写 ctx.Next(),后续路由 handler 就永远不会执行 —— 请求会在中间件里静默结束,返回空白 200。
这个行为常被误认为 “路由没注册成功”,实际是控制流卡在了中间件。
-
ctx.Next()必须出现在中间件函数体中,且通常放在逻辑判断之后(如鉴权通过才放行) - 若中间件提前终止(如
ctx.StopExecution()或ctx.StatusCode(401)+return),就不要调用ctx.Next() - 多个中间件串联时,每个都要自己决定是否调用
ctx.Next(),Iris 不提供“全局自动 next”开关 - 调试时可在中间件开头加
fmt.Println("before", ctx.Path()),结尾加fmt.Println("after", ctx.Path()),确认是否执行到末尾
ctx.Next(),问题往往不报错,只默默返回空或错的数据。


















