ctx.queryparam("key") 获取url中首个同名查询参数值并自动解码,不存在时返回空字符串;多值需用queryparams,特殊字符参数需启用withpostmaxmemory。

iris.Context.QueryParam 获取单个查询参数
直接调用 ctx.QueryParam("key") 即可拿到 URL 中第一个同名 query 参数的值,比如访问 /user?id=123&id=456,ctx.QueryParam("id") 返回 "123"。它内部自动做了 URL 解码,不用手动调用 url.QueryUnescape。
注意:如果参数不存在,返回空字符串 "",不是 nil;无法区分“没传”和“传了空值”。需要严格判断是否存在时,改用 ctx.URLParam 或检查 ctx.Request().URL.Query() 的 map。
- 适合快速取默认值场景,例如分页
page := ctx.QueryParam("page") - 不适用于多值同名参数(如复选框多个
name="tag"),此时应改用ctx.QueryParams - 若参数名含特殊字符(如点号
.、中括号[]),Iris 默认不解析——需启用iris.WithPostMaxMemory(32 并确认请求是 GET,否则可能被忽略
iris.Context.QueryParams 获取全部同名查询参数
当 URL 中出现重复 key(如 /search?tag=go&tag=web&tag=api),用 ctx.QueryParams("tag") 返回 []string{"go", "web", "api"}。这是唯一可靠获取多值 query 的方式。
它返回的是副本切片,修改不影响原始请求数据;底层基于 ctx.Request().URL.Query(),但封装后更安全(已处理 nil map 和空 key)。
- 不要用
ctx.Request().URL.Query()["tag"]直接取,因为 Go 的url.Values是 map[string][]string,但未初始化时访问会 panic -
ctx.QueryParams("missing")返回空切片[]string{},不是nil,可用len()判空 - 若需所有 query 键值对,用
ctx.Request().URL.Query(),但要自行遍历并注意解码——QueryParam系列方法已帮你做了
iris.Context.FormValue 不能用于 GET 查询参数
ctx.FormValue("key") 只从 POST/PUT 请求体(application/x-www-form-urlencoded 或 multipart/form-data)中读取,**完全忽略 URL query**。即使你在 GET 请求里拼了 ?name=john,ctx.FormValue("name") 仍返回空字符串。
这个行为常被误用,尤其从其他框架(如 Gin 的 c.DefaultQuery)迁移过来时。Iris 明确分离了 query、form、JSON 的读取路径,不自动 fallback。
- GET 请求必须用
QueryParam/QueryParams - POST 表单才用
FormValue/FormValues - 混合场景(如 POST + query)要分开处理:
id := ctx.QueryParam("id")和name := ctx.FormValue("name")
类型转换需手动处理,Iris 不自动转 int/bool
Iris 所有 QueryParam 相关方法只返回 string 或 []string。想转成 int、bool 或 float64,必须自己调用 strconv 包,比如 strconv.Atoi(ctx.QueryParam("limit"))。
没有内置 QueryInt 这类快捷方法,强行封装容易掩盖错误(如非数字输入返回 0 而不报错)。建议在业务逻辑层做校验:
- 用
strconv.ParseInt(ctx.QueryParam("offset"), 10, 64),检查 error - 布尔值别依赖
"true"/"false"字符串,用strings.EqualFold显式比对 - 对关键参数(如 ID、分页大小)建议加范围检查,避免传入极大值导致 DB 全表扫描
query 参数看似简单,但实际容易在多值、空值、类型转换、编码边界上出问题。Iris 的设计偏向显式和可控,不隐藏细节——这意味着你得亲手写几行 strconv,但也因此能清楚知道每个值从哪来、怎么变、哪里可能崩。











