iris mvc 不自动映射子路径,必须显式注册:get()仅匹配get /users,处理get /users/{id:long}需在beforeactivation中用b.handle("get", "/{id:long}", "getbyid")绑定,且参数名须为by+路由key首字母大写、类型标注完整(如{id:long})。

Iris MVC 不自动映射子路径,必须显式注册
Iris 的 MVC 模块不会根据方法名自动推导 /users/{id} 这类带参数的子路径。它只对根路径(如 /users)做默认匹配:比如 Get() 对应 GET /users,Post() 对应 POST /users。一旦你要处理 GET /users/{id:long},就必须手动介入。
关键不是“能不能自动”,而是 Iris 故意不自动——它把路径语义控制权交还给开发者,避免隐式行为导致调试困难或路由冲突。
-
BeforeActivation是唯一可靠入口,所有带变量、自定义动词或非标准路径都得在这里用b.Handle("GET", "/{id:long}", "GetByID")显式绑定 - 路径参数类型必须写全:
{id:long}才能被解析为int64,只写{id}会导致值恒为零 - 控制器方法名可以任意(如
FetchUser),但绑定时字符串必须完全一致:"FetchUser",大小写敏感且无空格
By 参数绑定失败的三个硬性前提
你写了 ByUserID int64,但始终收不到值?大概率卡在以下任一环节:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
- 控制器没挂到
mvc.Application:必须用mvc.New(party).Handle(new(MyController)),直接app.Get(...)定义的路由不走 By 绑定流程 - 路由参数没标类型:Party 下的路径如
userAPI.Get("/profile/{uid:int64}", "Profile")中的{uid:int64}缺一不可;{uid}或{UID:int64}都会失败 - 方法参数名不合规:必须是
By+ 路由 key 首字母大写,{user_id:string}→ByUserId string,ByUser_id或Byuser_id全部无效
BeforeActivation 里注册和依赖注入是一体两面
很多人以为 BeforeActivation 只干一件事:绑路径。其实它也是 MVC 里最自然的依赖注入时机。你不该在每个方法里 new service,而应在 BeforeActivation 中统一注册并注入字段。
- 先调用
b.Register(new(UserService)),再调用b.Handle(...),后续所有匹配方法都能通过结构体字段接收实例 - 若 controller 有字段
service *UserService,Iris 会在调用方法前自动赋值,无需手写c.service = ... - 注意顺序:注册必须在
Handle之前,否则字段为 nil;多个依赖按需注册,无隐式优先级
别信“自动”二字,404 是最诚实的反馈
当你改完代码却收不到请求,第一反应不该是查中间件或 CORS,而是立刻验证两点:
- 访问路径是否真命中了你注册的 Party 前缀?比如
mvc.New(app.Party("/api/v1")),那实际 URL 必须是/api/v1/users/123,少一个v1就 404 - 用
app.Logger().Infof("Routes: %+v", app.Routes().All())打印全部注册路由,确认GET /{id:long}确实出现在列表里,且 Method 和 Path 字段正确 - 如果日志里没有那条路由,说明
BeforeActivation根本没执行——检查是否漏掉了mvc.New(...).Handle(...)这一整套链路
路径注册这件事,没有魔法,只有三步:Party 划分、mvc.New 初始化、Handle 注册。跳过任何一环,By 参数、状态码设置、依赖注入,全都会静默失效。










