ctx.URLParam() 是读取 query string 的唯一正确方式,专用于获取 URL 末尾的键值对(如 /search?keyword=go),不处理路径参数、表单或 JSON;错误混用 ctx.Params().Get() 将导致静默失败。

ctx.URLParam() 是读 query string 的唯一正确方式
GET 请求中带在 URL 末尾的参数(如 /search?keyword=go&page=2)属于 query string,必须用 ctx.URLParam() 获取。它不处理路径里的动态段,也不解析表单或 JSON body。
常见错误是把 ctx.Params().Get() 混进来用——那只能取路由路径参数(比如 /user/{id} 中的 id),对 ?id=123 完全无效,会返回空字符串且不报错,极易漏判。
-
ctx.URLParam("keyword")返回"go";ctx.URLParam("missing")返回空字符串"",不会 panic - 若需默认值,用
ctx.URLParamDefault("page", "1"),避免手动判断空字符串 - 多个同名参数(如
?tag=a&tag=b)只取第一个,要全量请改用ctx.URLParams()["tag"](返回[]string)
路径参数和 query 参数别搞混了
同一个 URL /api/v1/users/123?format=json 里有两类参数:路径段 123 是路径参数,format=json 是 query 参数。它们来源不同、提取方式不同、校验机制也不同。
- 路径参数走
ctx.Params().Get("id"),前提是路由定义为app.Get("/users/{id}") - query 参数走
ctx.URLParam("format"),无需在路由里声明 - 拼错名字(比如路由写
{userID}却调ctx.Params().Get("id"))返回空字符串,没有运行时提示——这是最常被忽略的空值来源
需要类型安全?优先用带类型后缀的方法
直接用 ctx.URLParam() 拿到的是字符串,后续转数字容易出错。Iris 提供了类型安全封装,比手写 strconv.Atoi() 更可靠。
-
ctx.URLParamInt("limit", 10):不存在或非整数时返回默认值10,不 panic -
ctx.URLParamInt64("offset"):返回(int64, error),必须检查err != nil才能继续用 -
ctx.URLParamFloat64("score")和ctx.URLParamBool("active")同理,布尔值识别"1"/"true"/"on"等常见真值
注意 URL 编码和特殊字符处理
前端传来的中文、空格、斜杠等会被自动编码(如 hello world → hello%20world),ctx.URLParam() 内部已自动解码,你拿到的就是原始字符串,不用再调 url.QueryUnescape()。
- 但如果 query 值本身含
&或=(比如加密 token),应由前端用encodeURIComponent()处理,后端照常ctx.URLParam("token") - 空值参数如
?name=会被识别为"",不是nil;而完全没传name字段时才是空字符串 - 参数名大小写敏感:
ctx.URLParam("Name")≠ctx.URLParam("name")
ctx.URLParam() 返回非空值却不做空判断——因为它的失败静默得毫无提示。


















