iris中by参数绑定仅在mvc.configure注册控制器后生效,必须通过mvc.new(app.party("/xxx")).handle(new(mycontroller))完成绑定;若未注册或混用app.get,则by参数始终为零值且无提示。

By参数绑定只在MVC注册后生效
没走 mvc.Application.Handle() 注册的控制器,By 前缀参数完全不会注入,值永远是零值,且无任何错误提示。这是最常踩的坑——路由写对了、方法签名也照着文档写了,但参数就是拿不到。
- 必须用
mvc.New(app.Party("/xxx"))创建 MVC 实例,再调Handle(new(MyController)) - 不能直接用
app.Get("/xxx", handler)混用,否则ByUid、ByRole这类参数形同虚设 - 路由中参数必须显式标注类型,比如
{uid:int64},写成{uid}就不触发 By 绑定 - 方法参数名必须严格为
By+ 路由键名首字母大写,{user_id:string}对应ByUserId string,错一个字母或大小写就失败
URL 查询参数和表单参数得手动读
MVC 控制器里没有自动绑定 query 或 form 参数的机制,By 只管路径参数。想拿 ?page=1&size=20 或 POST /login?username=a 里的内容,得靠 iris.Context。
- 查询参数统一用
c.URLParam("key")或带默认值的c.URLParamDefault("key", "default") - 表单数据(
application/x-www-form-urlencoded)用c.PostValue("field"),不是c.FormValue(后者仅用于 multipart) - JSON 请求体要解析,得显式调
c.ReadJSON(&v),且结构体字段必须导出+加json:tag - 别在 MVC 方法里混用
ctx.ReadJSON和ByXxx,它们来源不同、生命周期独立,没冲突但也没自动关联
路径参数捕获与类型安全校验
哪怕用了 By 绑定,底层还是依赖路由宏做类型判断。如果只写 {id},Iris 当字符串处理;写成 {id:uint64},匹配失败直接 404,进不了方法体。
-
{id:uint64}→ById uint64,此时转换必然成功,不用检查 error -
{id}→ById string,后续要转整型,得自己用strconv.ParseUint并处理 panic - 想捕获完整子路径,比如
/files/a/b/c.txt中的a/b/c.txt,路由写{path:path},参数写ByPath string,但注意它不会自动 URL 解码 - 自定义宏如
{oid:int min(1)}在匹配阶段拦截非法值,比在方法里 if 判断更早、更干净
WebSocket 控制器参数获取方式完全不同
MVC WebSocket 控制器不走 HTTP 参数那一套,By 绑定完全不适用。连接建立后,参数来自客户端发的 neffos.Message.Body,不是 URL 或 query。
- 方法签名必须接收
*neffos.NSConn和neffos.Message,例如func(c *ChatCtrl) Join(ns *neffos.NSConn, msg neffos.Message) error -
msg.Body是原始字节,通常需json.Unmarshal(msg.Body, &v)解析成结构体 - 若需读取升级时的 HTTP 上下文(比如 Session),得调
websocket.GetContext(ns.Conn)拿到iris.Context,再用c.Session().Get("user_id") - 别试图在 WS 控制器里用
By或c.Params(),它们在 WebSocket 生命周期里不可用
By 绑定和普通 HTTP handler 的 c.Params() 是两套并行机制,不能混用逻辑,也不能指望其中一套替另一套干活。











