iris mvc中路径参数需严格匹配方法签名:{id:long}对应id int64,大小写敏感且仅支持int、int64、bool、string;多参数如{id:long}/{slug:string}须写为id int64, slug string;不可用指针或自定义类型。

如何从路径中提取动态参数(如 /user/{id:long})
Iris MVC 会自动把路径中的命名参数(比如 {id:long}、{username:string})映射为控制器方法的入参,前提是方法签名里有对应类型和名字的参数。
常见错误是参数名不匹配或类型不对:比如路径写成 /user/{uid:long},但方法定义却是 GetBy(id int64) —— 这时 id 拿不到值,始终为零值。
- 路径参数名必须和方法参数名**完全一致**(大小写敏感),例如
{id:long}→ 方法参数必须叫id int64 - 支持的类型只有
int、int64、bool、string;用uint或自定义类型会绑定失败 - 如果路径含多个参数,如
/post/{id:long}/{slug:string},方法签名就得是GetBy(id int64, slug string) - 别在参数前加指针(
*int64)或切片,Iris 不识别,会静默忽略
如何接收 JSON 请求体(application/json)
JSON 数据不会自动解析,必须显式声明结构体参数,且请求头 Content-Type: application/json 必须正确设置,否则 ctx.ReadJSON 会被跳过,参数保持零值。
示例中若前端发的是 {"name":"Alice","age":25},控制器方法应写成:
func (c *UserController) Post(ctx iris.Context, user User) string {
// Iris 自动调用 ctx.ReadJSON(&user)
return user.Name
}
- 结构体字段必须是**导出字段**(首字母大写),否则 JSON 解析失败且无报错
- 想忽略空字段,得在 struct tag 加
json:",omitempty",例如Name string `json:"name,omitempty"` - 不要在方法里再手动调
ctx.ReadJSON—— 重复读会导致ctx.Request().Body已关闭,后续中间件或日志拿不到原始 body - 如果结构体字段名和 JSON key 不一致,必须用
json:"xxx"显式标注,否则绑定不上
如何读取表单数据(application/x-www-form-urlencoded)
Iris MVC **不支持**用结构体直接绑定表单数据。这是和 JSON 绑定最易混淆的点:即使你写 Post(ctx iris.Context, form LoginForm),form 也永远是零值。
必须改用 ctx.PostValue("field_name") 或 ctx.FormValue("field_name") 手动取值。
-
PostValue和FormValue行为一致,都是从表单中取字符串;区别仅在于语义,推荐统一用PostValue - 需要类型转换时,自己调
strconv.Atoi、strconv.ParseBool等,Iris 不做自动转换 - 多选框(
<input type="checkbox" name="roles" value="admin">)要用ctx.PostValues("roles")获取字符串切片 - 文件上传不能靠这个,得用
ctx.FormFile("file")配合ctx.SaveFormFile
为什么 ctx.URLParam() 和 ctx.Params().Get() 拿不到值?
这两个方法只对 app.Party().Get("/path/{param}") 这类**路由参数**有效,而 MVC 的路径参数(如 GetBy(id int64))是框架在调用前就解包并传入的,不经过 ctx.Params() 流程。
如果你在 MVC 方法里调 ctx.Params().Get("id"),结果一定是空字符串 —— 因为它查的是 ctx.Request().URL.Query()(即 ?id=123 这种查询参数),不是路径参数。
- 路径参数 → 直接作为方法参数接收,别去 ctx.Params() 查
- 查询参数(?key=value)→ 用
ctx.URLParam("key")或ctx.FormValue("key")(二者等价) - Header 值 → 用
ctx.GetHeader("X-User-ID") - Cookie → 用
ctx.Cookies().Get("session_id")











