路由路径参数用c.param()获取,如/router/:id对应c.param("id");查询参数用c.query()系列;表单用c.postform();json用c.shouldbindjson();四者完全隔离,不可混用。

路由路径参数怎么取:用 c.Param(),不是 c.Query()
路径参数(如 /user/:id)和查询参数(如 /user?id=123)是两套完全独立的机制,混用会导致取不到值。Gin 不会自动把 :id 映射到 query 字段里。
-
c.Param("id")只对路径中带冒号定义的部分生效,比如router.GET("/order/:oid", handler),请求/order/1001时才能取到"1001" - 如果路径写成
/order/:oid/(结尾带斜杠),请求/order/1001就不匹配,必须访问/order/1001/ - 通配符
*action会捕获路径剩余部分(含斜杠),c.Param("action")返回的是/edit/status这样的完整子路径字符串,不是自动分割后的数组
查询参数(?key=value)要用 c.Query() 系列方法
URL 中问号后的内容属于 query string,Gin 提供了三类常用取法,适用场景不同:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
c.Query("page"):只取第一个同名参数,?page=2&page=5返回"2" -
c.QueryArray("tag"):适合多值场景,?tag=go&tag=web&tag=gin返回[]string{"go","web","gin"} -
c.DefaultQuery("limit", "20"):有值就用,没传就 fallback,默认值必须是字符串类型 - 注意:
c.GetQuery()和c.Query()行为一致;但c.ShouldBindQuery(&struct{})可批量绑定到结构体,适合参数多且固定时
POST 表单和 JSON 参数不能都用 c.PostForm()
表单参数(application/x-www-form-urlencoded 或 multipart/form-data)和 JSON 是不同 Content-Type,解析方式完全不同:
-
c.PostForm("username")只能读取表单类请求,对Content-Type: application/json的请求始终返回空字符串 - JSON 请求必须用
c.ShouldBindJSON(&v)或先c.GetRawData()再手动解码;直接调c.PostForm()会静默失败 - 如果前端发的是 JSON 但后端用
PostForm取值,日志里看不到报错,但变量永远为空——这是最常被忽略的调试盲点 - 混合场景(比如 URL 带 query、body 是 JSON)要分开处理:
c.Query("trace_id")+c.ShouldBindJSON(&req)
路由分组 + 参数嵌套时,c.Param() 仍只认当前注册路径
分组不会改变参数提取逻辑,c.Param() 查找范围仅限于该 handler 注册时的完整路径模式:
-
v1 := router.Group("/api/v1"); v1.GET("/users/:uid", handler)→c.Param("uid")有效 -
v1.POST("/import", handler)没定义路径参数 →c.Param("uid")返回空字符串,哪怕请求是/api/v1/import?uid=123 - 分组前缀(如
/api/v1)本身不参与参数匹配,也不会自动注入为上下文字段 - 需要跨层级共享数据,应该用
c.Set("key", value)+c.MustGet("key"),而不是依赖路径参数










