Iris的CRUD路由需显式注册:app.Get("/users")列表、app.Post("/users")创建、app.Get("/users/:id")单查、app.Put("/users/:id")全量更新、app.Delete("/users/:id")删除;路径参数用:id语法并以ctx.Params().Get("id")提取,查询参数用ctx.URLParam()。

Iris 没有自动 Resource 路由,必须手动为每个 HTTP 方法注册处理函数——这不是限制,而是避免隐式约定带来的调试混乱和维护成本。
怎么注册标准 CRUD 路由
用 app.Get、app.Post、app.Put、app.Delete 显式绑定,路径参数统一用 :id(不是 {id} 或 ):
-
app.Get("/users", listHandler)—— 列表查询,支持ctx.URLParam("page")和ctx.URLParam("limit") -
app.Post("/users", createHandler)—— 创建资源,用ctx.ReadJSON(&u)解析 JSON 请求体 -
app.Get("/users/:id", getHandler)—— 单条查询,用ctx.Params().Get("id")提取路径参数 -
app.Put("/users/:id", updateHandler)—— 全量更新;若只改部分字段,建议用Patch并明确约定字段白名单 -
app.Delete("/users/:id", deleteHandler)—— 删除,注意幂等性:重复删除应返回 204 或 404,而非报错
别写 app.Handle("PUT", "/users/:id", ...) —— 它绕过 Iris 的方法校验和自动 OPTIONS 响应,跨域 PUT 请求会因预检失败而被浏览器拦截。
路径参数和查询参数怎么取才不混淆
两者来源不同、API 不同,混用必出错:
- 路径参数(如
/users/123/orders中的123)只能用ctx.Params().Get("id")或带类型转换的ctx.Params().GetInt64("id");ctx.URLParam("id")永远返回空 - 查询参数(如
?page=2&sort=name)必须用ctx.URLParam("page"),ctx.Params().Get("page")无效 - 参数名大小写敏感:
:ID定义的路径,必须用ctx.Params().Get("ID"),写成"id"得到空字符串,且不 panic,容易漏掉非空校验 - 批量 ID 查询如
?ids=1,2,3需手动strings.Split(ctx.URLParam("ids"), ","),Iris 不内置数组解析
嵌套路由组怎么保持版本隔离和 REST 语义
用 app.Party 构建前缀链,所有子路由必须基于该 Party 实例注册:
- 正确:
api := app.Party("/api/v1"); users := api.Party("/users"); users.Get("", listHandler); users.Get("/:id", getHandler)→ 实际路径是/api/v1/users和/api/v1/users/123 - 错误:在
users组里写app.Get("/:id/orders", ...)→ 路径变成/:id/orders,脱离/api/v1上下文 - 更隐蔽的坑:
users.Get("/:id/orders")是合法的,但若没定义orders控制器或 handler,404 时很难定位是路由前缀断了还是 handler 没挂上 - 若需复用同一前缀注册多个控制器,共用一个
Party实例即可,不要为每个控制器新建 Party
MVC 模式下怎么让方法对应 RESTful 路径
MVC 不是“自动扫描+命名推导”,而是强依赖显式绑定:
- 必须先
api := app.Party("/api"),再mvc.New(api).Handle(new(UserController));直接mvc.New(app)会失效 - 方法名(如
GetByID)不会自动映射到/users/:id;必须在BeforeActivation里手写绑定:b.Handle("GET", "/:id", "GetByID") -
:id后可加类型约束:/:id:uint64,Iris 在路由匹配阶段就拦截非法值(如/users/abc直接 404),不用进 handler 再校验 -
By前缀参数(如ByUserID uint64)只在 MVC 注册的 handler 中生效;手写app.Get路由时完全忽略
最易被忽略的一点:通配路由 /{path:path} 必须放在所有显式路由之后,并手动排除 /api/ 等前缀,否则 API 请求会被前端 fallback 逻辑吞掉,查日志只看到一堆 200 HTML 响应,实际接口根本没进 handler。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











