Iris 动态绑定 URL 路径参数仅有两种可靠方式:ctx.Params().Get() 手动提取或 MVC 的 By 前缀自动注入;无隐式绑定,大小写敏感,类型需显式转换,By 绑定须满足注册、类型声明和命名三条件。

Iris 动态绑定 URL 路径参数只有两种可靠方式:用 ctx.Params() 手动提取,或通过 MVC 的 By 前缀自动注入——没有第三种“隐式绑定”或“方法名推导”机制。
ctx.Params().Get() 是最直接、最可控的获取方式
所有花括号定义的路径参数(如 /user/{id}/{name})都会被 Iris 解析并存入上下文参数池,必须显式调用 ctx.Params().Get("id") 获取。不写这行代码,参数就不存在于 handler 里。
- 参数名大小写敏感:
{ID:int}定义后,ctx.Params().Get("ID")有效,ctx.Params().Get("id")返回空字符串 - 类型转换必须自己做:
ctx.Params().Get("id")永远返回string,要转int64得用GetInt64Default()或GetUint64(),且后者必须检查err - 若路由是
/files/{path:path},ctx.Params().Get("path")返回带斜杠的完整子路径(如"a/b/c.txt"),不会自动解码,含%20需手动调url.PathUnescape()
MVC 中 By + 首字母大写 是唯一自动绑定路径参数的方式
控制器方法参数加 By 前缀(如 ById int64)能自动注入,但前提是三个条件全部满足,缺一不可:
- 控制器必须注册到
mvc.Application实例,例如mvc.New(app.Party("/api")).Handle(new(UserController));直接用app.Get()写路由,By完全无效 - 路由中必须显式声明类型,如
/user/{id:int64},写成/user/{id}或/user/{ID:int64}都会导致绑定失败(零值,无报错) - 参数名必须严格匹配:路由键名
user_id→ 方法参数必须是ByUserId string,不是ByUserid、By_id或ByUserID
别指望方法名或路径自动推导参数
Iris 不会因为方法叫 GetByID 就自动把 {id} 绑定过去,也不会因为路由是 /users/{id} 就默认把 id 注入到任意参数名为 id 的函数参数里。
- 想让
GetByID处理/users/{id:long},必须在BeforeActivation里显式调b.Handle("GET", "/{id:long}", "GetByID") - 如果漏写
{id:long}中的:long,GetByID(id int64)的id永远是0,不是报错,而是静默失败 - 使用
hero.Handler可以支持函数参数自动绑定(如func(id int64) string),但它和 MVC 的By机制互斥,不能混用同一套路由逻辑
最容易被忽略的是:路径参数绑定不依赖请求体、不依赖查询字符串、也不受中间件影响——它只发生在路由匹配完成的瞬间,且只从 URL 路径段中提取。任何试图绕过 ctx.Params() 或 By 规则去“猜”参数的行为,都会在某个请求上突然失效。


















