Gin 接收前端传参方式有几种?

0 阅读4分钟

Gin 接收前端传参方式有几种?

路径参数(RESTful 风格必用)

参数在 URL 路径里,比如 /user/123

c.Param(key string) string

  • 作用:从 URL 路径中提取定义好的参数值
  • 参数key 是路由中定义的路径变量名(如 :id 中的 id
  • 返回值:字符串类型的参数值
package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()

	// 定义路由::id 是路径参数
	r.GET("/user/:id", func(c *gin.Context) {
		// 使用 c.Param() 获取路径参数
		id := c.Param("id")
		c.JSON(200, gin.H{
			"用户ID": id,
		})
	})

	r.Run(":8080")
}

访问:http://127.0.0.1:8080/user/1001返回:{"用户ID":"1001"}

查询字符串(Query 参数)

参数在 URL 问号后面,比如 /search?keyword=golang&page=1

c.Query(key string) string

  • 作用:获取 URL 查询参数
  • 参数key 是查询参数的键名
  • 返回值:字符串类型的参数值;若参数不存在,返回空字符串

c.DefaultQuery(key, defaultValue string) string

  • 作用:获取 URL 查询参数,带默认值

  • 参数

    • key:查询参数的键名
    • defaultValue:参数不存在时的默认值
  • 返回值:字符串类型的参数值;若参数不存在,返回 defaultValue

r.GET("/search", func(c *gin.Context) {
	// 1. 普通获取(没传就是空字符串)
	keyword := c.Query("keyword")

	// 2. 带默认值获取
	page := c.DefaultQuery("page", "1")

	c.JSON(200, gin.H{
		"关键词": keyword,
		"页码":   page,
	})
})

访问:http://127.0.0.1:8080/search?keyword=Gin返回:{"关键词":"Gin","页码":"1"}

表单数据(Form 表单)

前端用 <form> 提交,或者 Postman 选 x-www-form-urlencoded

c.PostForm(key string) string

  • 作用:获取 POST 表单数据
  • 参数key 是表单字段名
  • 返回值:字符串类型的字段值;若字段不存在,返回空字符串

c.DefaultPostForm(key, defaultValue string) string

  • 作用:获取 POST 表单数据,带默认值

  • 参数

    • key:表单字段名
    • defaultValue:字段不存在时的默认值
  • 返回值:字符串类型的字段值;若字段不存在,返回 defaultValue

r.POST("/login", func(c *gin.Context) {
	// 1. 普通获取
	username := c.PostForm("username")

	// 2. 带默认值
	password := c.DefaultPostForm("password", "123456")

	c.JSON(200, gin.H{
		"账号": username,
		"密码": password,
	})
})

JSON 数据(最常用,前后端分离)

前端发 application/json,这是目前最主流的方式。

c.ShouldBindJSON(obj any) error

  • 作用:将请求体中的 JSON 数据绑定到结构体指针上
  • 参数obj结构体指针(必须传指针,否则无法修改原对象)
  • 返回值error 类型;若绑定成功返回 nil,失败返回错误信息(如 JSON 格式错误、字段类型不匹配)
// 1. 先定义结构体(对应 JSON 字段)
type User struct {
	Name string `json:"name"` // 注意 tag 是 json
	Age  int    `json:"age"`
}

r.POST("/register", func(c *gin.Context) {
	var user User

	// 2. 使用 ShouldBindJSON 绑定 JSON 到结构体
	if err := c.ShouldBindJSON(&user); err != nil {
		c.JSON(400, gin.H{"错误": err.Error()})
		return
	}

	c.JSON(200, gin.H{
		"注册成功": user,
	})
})
前端请求示例
fetch('http://127.0.0.1:8080/register', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: "张三", age: 18 })
})

前端可以传多余字段,但后端只绑定自己关心的。


文件上传(单文件 / 多文件)

c.FormFile(key string) (*multipart.FileHeader, error)

  • 作用:获取上传的单个文件

  • 参数key 是表单中文件字段的名称

  • 返回值

    • *multipart.FileHeader:文件对象,包含文件名、大小等信息
    • error:若获取失败返回错误信息

c.SaveUploadedFile(file *multipart.FileHeader, dst string) error

  • 作用:将上传的文件保存到本地指定路径

  • 参数

    • filec.FormFile() 获取到的文件对象
    • dst:文件保存的目标路径(如 ./avatar.jpg
  • 返回值error 类型;若保存成功返回 nil,失败返回错误信息

r.POST("/upload", func(c *gin.Context) {
	// 1. 获取上传的文件
	file, err := c.FormFile("avatar")
	if err != nil {
		c.JSON(400, gin.H{"错误": "上传失败"})
		return
	}

	// 2. 保存到本地
	c.SaveUploadedFile(file, "./"+file.Filename)

	c.JSON(200, gin.H{
		"文件名": file.Filename,
		"大小":   file.Size,
	})
})

统一参数绑定(推荐)

如果不想手动一个个取参数,Gin 支持自动绑定

c.ShouldBind(obj any) error

  • 作用:根据请求类型自动绑定参数(支持 Query、Form、JSON 等)
  • 参数obj 是结构体指针(结构体字段需加对应 tag,如 form:"keyword"
  • 返回值error 类型;绑定成功返回 nil,失败返回错误信息
// 定义结构体,tag 同时支持 query 和 json
type SearchParams struct {
	Keyword string `form:"keyword" json:"keyword"`
	Page    int    `form:"page" json:"page"`
}

r.GET("/search2", func(c *gin.Context) {
	var params SearchParams
	// 自动根据请求类型绑定(Query/Form/JSON)
	if err := c.ShouldBind(&params); err != nil {
		c.JSON(400, gin.H{"错误": err.Error()})
		return
	}
	c.JSON(200, params)
})

一张表总结怎么选

传参方式适用场景核心 Gin 方法
路径参数RESTful API(如 /user/1c.Param()
Query 参数GET 请求筛选、分页c.Query() / c.DefaultQuery()
Form 表单传统网页表单提交c.PostForm() / c.DefaultPostForm()
JSON 数据前后端分离、复杂数据c.ShouldBindJSON()
文件上传头像、附件上传c.FormFile() / c.SaveUploadedFile()