Iris中RESTful路由需手动用Get/Post/Put/Delete等方法注册,不支持自动Resource映射;路径参数用ctx.Param("id")提取,查询参数用ctx.URLParam("page");嵌套路由组须保持前缀链,避免脱离版本上下文。

RESTful路由在Iris中就是用Get/Post/Put/Delete等方法注册
Iris不提供类似Route或Resource的自动REST资源映射,必须手动为每个HTTP方法绑定处理函数。这不是缺陷,而是设计取舍:避免隐式约定带来的维护成本和调试困难。
常见错误是试图写app.Resource("/users", handler)——Iris没有这个API,强行封装反而容易混淆请求生命周期。
- 标准CRUD对应方法:用户列表用
Get,创建用Post,单条更新用Patch或Put,删除用Delete - 路径参数统一用
:id(不是{id}或<id>),例如/users/:id - 不要在同一个路径上混用
Put和Patch——Iris不会报错,但语义冲突会导致前端调用混乱
如何提取路径参数和查询参数
ctx.Param("id")取:id段,ctx.URLParam("page")取?page=1里的值,两者不能互换。Iris不自动解析URL查询字符串到结构体,需手动调用ctx.QueryArgs()或使用ctx.ReadQuery(&v)。
典型坑点:当路径是/users/:id/orders且请求为GET /users/123/orders?page=2时,ctx.Param("id")返回"123",ctx.URLParam("page")才返回"2";若误用ctx.Param("page")会得到空字符串。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 路径参数名必须与路由定义中
:xxx完全一致,大小写敏感 -
ctx.FormValue只适用于POST/PUT表单提交,对JSON请求无效,此时应改用ctx.ReadJSON - 批量ID查询如
?ids=1,2,3需自行strings.Split,Iris不内置数组解析
为什么不要用Handle代替具体方法
app.Handle("GET", "/users", h)看似灵活,但绕过了Iris内置的HTTP方法校验和OPTIONS预检支持。当你注册了Get和Post,Iris会自动响应OPTIONS /users并返回Allow: GET, POST;而用Handle则需手动实现,否则CORS预检失败。
- 浏览器发起跨域
PUT请求前必发OPTIONS,缺失响应头会导致请求被拦截 -
Handle注册的路由无法被app.GetRoutes()正确归类,影响文档生成或监控统计 - 调试时
iris.Logger().SetLevel(iris.LogDebug)输出的路由表里,Handle条目显示为UNKNOWN方法,增加排查难度
嵌套路由组怎么保持REST语义
用app.Party("/api/v1")做前缀分组没问题,但子组如users := api.Party("/users")之后,必须继续用users.Get、users.Post等,而不是回到app.Get。否则路径会变成/users而非/api/v1/users,破坏版本隔离。
另一个常见疏漏:在users组内注册users.Get("/:id/orders"),实际路径是/api/v1/users/:id/orders,但如果误写成app.Get("/users/:id/orders"),就脱离了v1上下文,后续升级v2时难以平滑迁移。
- 组内嵌套组也适用相同规则,例如
orders := users.Party("/:id/orders")后,应调用orders.Get而非users.Get - 所有组变量建议用有意义的命名(如
v1api、admin),避免g、r等缩写,否则多人协作时容易误用父组方法 - 中间件作用域按组生效,
users.Use(authMiddleware)不会影响/api/v1/products,这点比全局中间件更可控
OPTIONS响应和路径参数作用域——它们不出现在代码主干里,却直接决定前端能否正常调用。多看两眼app.GetRoutes()输出,比反复测接口更快定位问题。


















