应使用 ctx.FormValue 读取查询参数,它自动从 URL 查询字符串、表单和 multipart 中取值;若需严格限定只读 query,用 ctx.Request().URI().QueryArgs().Get;多参数校验推荐 ctx.ReadQuery + 结构体绑定。

不能用 ctx.ParamDecoded 或 ctx.Params().Get 读 query string,它们只处理路径参数(如 /user/{id}),对 ?name=alice 完全无效。
用 ctx.FormValue 最简单直接
它自动从 URL 查询字符串、application/x-www-form-urlencoded 表单、multipart/form-data 中取值,语义清晰且覆盖常见场景:
- 参数缺失时返回空字符串,适合轻量逻辑(如
name := ctx.FormValue("name")) - 若需区分“未传”和“传了空字符串”,改用
ctx.FormValues()检查切片长度 - 注意:当请求头
Content-Type不是表单类型时,FormValue会跳过 body 解析,只查 query —— 这在调试时容易误判来源
明确只读 query 时,用 ctx.Request().URI().QueryArgs().Get
当你需要 100% 确保只从查询字符串取值(不混入 POST 数据),且不依赖 FormValue 的隐式优先级,就该走这条路:
-
ctx.Request().URI().QueryArgs().Get("limit")返回[]byte,记得转string() - 遍历全部参数用
VisitAll,回调里 key/value 都是[]byte,别直接当string用 -
QueryArgs()是只读的,调.Set()无效,强行修改可能 panic
需要校验或默认值?用 ctx.ReadQuery + 结构体
适合 GET 接口带多个可选/必填参数(如 /search?name=&age=25&page=1):
- 定义结构体,字段加
url:标签(如Name string `url:"name" validate:"required"`) - 调
ctx.ReadQuery(&input),失败时返回validator错误,可统一返回 400 - 空字符串对
int字段默认转成 0;要区分“未传”和“传了 0”,字段类型得用*int - 必须显式写
url:标签,否则字段不会从 query 绑定
最容易被忽略的是:Iris MVC controller 方法签名不自动绑定 query 参数,func Get(id int) 永远拿不到 ?id=123,必须显式调 ReadQuery 或用 FormValue。别指望框架替你猜来源。











