iris mvc控制器方法名必须严格匹配http方法+路径后缀,如get()对应get/、getinfo()对应get/info;不支持任意命名,路径参数需手动从ctx.params()获取,且必须调用app.run()启动服务。

控制器方法名必须严格匹配 HTTP 方法 + 可选后缀
Iris 的 MVC 控制器不是靠注解或配置驱动的,而是靠方法命名自动绑定路由。比如 Get() 对应 GET /,PostLogin() 对应 POST /login。大小写、拼写、顺序都不能错——少个 P 或多加下划线,方法就完全不会被调用。
常见错误现象:浏览器访问 /info 返回 404,但控制器里明明写了 Getinfo() 或 getInfo();或者 PostUser() 没触发,实际定义的是 Postuser()。
-
Get()、Post()、Put()、Delete()等八种标准方法名必须首字母大写、其余小写 - 带路径后缀的方法(如
GetInfo())会自动映射到GET /info,不是/GetInfo - 不支持任意自定义方法名直接暴露为路由;没按规则命名的方法会被忽略,也不报错
- 如果同时存在
Get()和GetHome(),前者响应/,后者响应/home,无需额外注册
控制器必须用指针接收者,且不能在方法内修改 struct 字段
Iris 在每次请求时都会 new 出一个控制器实例(除非显式设为单例),所以控制器 struct 本身不适合存请求间共享状态。如果你在 Get() 里给 c.count++,下次请求进来时 count 还是初始值。
使用场景:想在控制器里访问上下文、读取参数、调用 service 层——这些都应该通过字段注入或方法参数完成,而不是靠 struct 字段暂存。
- 所有控制器方法必须用指针接收者:
func (c *MyController) Get() {},值接收者无效 - struct 字段可用于注入依赖(如
Service *UserService),但不能用于存请求临时数据 - 需要跨中间件/方法共享数据?用
ctx.Values().Set("key", val),别塞 struct 里 - 真要单例控制器?得在
BeforeActivation里手动注册为 singleton,否则默认每次请求新建
路径参数和 query 参数必须用对 API
控制器方法签名里可以声明路径参数(如 {id:uint64}),但 Iris 不会自动把它们塞进方法参数——你得自己从 ctx.Params() 拿。很多人误以为写 func (c *C) GetItem(id uint64) {} 就能自动绑定,其实不行,这是 hero 包的功能,不是 MVC 默认行为。
常见错误现象:路由写了 /user/{id:uint64},控制器里却用 ctx.URLParam("id") 取值,结果始终为空;或者方法签名写了参数但没生效,IDE 提示未使用变量。
- 路径参数统一走
ctx.Params().Get("id")或带类型的GetInt64("id") -
ctx.URLParam()只处理 URL 查询字符串,例如?page=2 - MVC 控制器方法签名中**不支持自动绑定路径参数**;若想用形参方式,得切换到
hero.Handler或改用普通 handler - 参数名必须和路由中花括号内一致:
{user_id:int}→ctx.Params().Get("user_id"),不是"id"
启动服务前必须调用 Run() 或 Listen()
写完控制器、调用 mvc.New(app.Party("/")).Handle(new(MyController)),不代表服务已运行。Iris 应用初始化后是静默状态,不监听端口、不处理请求——这点和很多框架不同,容易让人以为代码有 bug。
典型表现:终端执行 go run main.go 后立刻返回命令行,或者进程卡住但浏览器访问 localhost:8080 超时无响应。
- 必须在最后加
app.Run(iris.Addr(":8080"))(v12+ 推荐)或app.Listen(":8080") -
Run()支持传入iris.Configuration,比如超时、TLS 配置;Listen()是简化版 - 如果用了
iris.TLS()却只调Listen(),HTTPS 不会生效 - 漏掉这一步,整个 MVC 注册都白做——路由根本没加载进 router











