Iris中四类参数必须严格区分读取方法:路径参数用ctx.Params().Get(),查询参数用ctx.URLParam(),表单用ctx.FormValue(),JSON用ctx.ReadJSON();混用将导致取值失败。

路径参数、查询参数、表单、JSON——Iris 里这四类参数必须用不同方法读,混用就拿不到值。
ctx.Params().Get() 才是取路径参数的正确方式
很多人误用 ctx.URLParam() 去读 /user/123 这种路径里的 123,结果永远是空字符串。因为 ctx.URLParam() 只处理 URL 查询串(?id=123),不是路径段。
- 路径参数写法:注册路由时用
app.Get("/user/{id:uint64}", handler)或旧式/user/:id - 读取方式:在 handler 中调用
ctx.Params().Get("id"),或带类型转换的ctx.Params().GetInt64("id") - 参数名大小写敏感:路由定义是
{userID},就不能写ctx.Params().Get("userid") - 没匹配上时返回空字符串,不 panic —— 容易漏掉校验,建议加
if id == "" { ctx.StopWithStatus(400) }
ctx.URLParam() 只负责 ?query=string 这类参数
比如请求 /search?keyword=go&limit=10,这时候才轮到 ctx.URLParam() 出场。它和 ctx.FormValue() 一样,底层依赖 ParseForm(),但只从 URL 查询部分提取。
- 它对 POST 请求体里的 query string 也有效(如
curl -X POST 'http://a.b/c?foo=bar') - 不能替代
ctx.Params(),也不能读 JSON body - 如果前端用
fetch('/api?x=1', { method: 'POST', body: '{}' }),ctx.URLParam("x")能拿到"1",但ctx.FormValue("x")拿不到
ctx.ReadJSON() 和 ctx.FormValue() 别交叉使用
前端发的是 JSON,却用 ctx.FormValue() 读,结果全是空;前端发的是表单,却调 ctx.ReadJSON(&v),会报 invalid character 错误——这是最常发生的静默失败。
- JSON 请求:Content-Type 必须是
application/json,且必须调ctx.ReadJSON(&v),之后立刻检查err != nil - 表单请求:Content-Type 是
application/x-www-form-urlencoded或multipart/form-data,用ctx.FormValue("key") - 结构体字段名要对齐:JSON 字段
"user_name"对应结构体字段需加 tagjson:"user_name",否则默认按 Go 字段名(UserName)匹配 -
ctx.ReadJSON不校验 required 字段,也不会自动忽略未知字段,得靠结构体 tag 控制,比如json:"name,omitempty"
ctx.Param() 是过时写法,别再用了
旧文档或老项目里可能看到 ctx.Param("id"),但它在较新版本 Iris(v12.2+)中已被标记为 deprecated,实际行为等价于 ctx.Params().Get("id"),但语义模糊、易和 ctx.URLParam() 混淆。
- 统一改用
ctx.Params().Get()或带类型的ctx.Params().GetInt64()等 -
ctx.Param()在某些中间件场景下可能返回空,而ctx.Params()更稳定 - IDE 自动补全现在也优先提示
Params(),Param()已基本不出现
真正容易被忽略的是:Iris 不做“自动格式推断”。你得自己判断前端发的是什么、选对读取方法、手动校验 error。没有 magic,只有明确分工。











