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

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

路径参数(RESTful 风格必用)

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

c.Param(key string) string

  • 作用:从 URL 路径中提取定义好的参数值
  • 参数key 是路由中定义的路径变量名(如 :id 中的 id
  • 返回值:字符串类型的参数值
go 复制代码
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

go 复制代码
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

go 复制代码
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 格式错误、字段类型不匹配)
go 复制代码
// 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,
	})
})
前端请求示例
javascript 复制代码
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,失败返回错误信息

go 复制代码
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,失败返回错误信息
go 复制代码
// 定义结构体,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/1 c.Param()
Query 参数 GET 请求筛选、分页 c.Query() / c.DefaultQuery()
Form 表单 传统网页表单提交 c.PostForm() / c.DefaultPostForm()
JSON 数据 前后端分离、复杂数据 c.ShouldBindJSON()
文件上传 头像、附件上传 c.FormFile() / c.SaveUploadedFile()

相关推荐
铁皮饭盒35 分钟前
成为AI全栈 - 第3课:路由 RESTful Elysia 状态码 设计规范
前端·后端·全栈
顾昂_1 小时前
Web 性能优化完全指南
前端·面试·性能优化
其实防守也摸鱼1 小时前
CTF密码学综合教学指南--第九章
开发语言·网络·python·安全·网络安全·密码学·ctf
砚底藏山河1 小时前
Python量化开发:2026最佳实时股票数据API接口推荐与对比
开发语言·windows·python
前端程序媛-Tian1 小时前
前端 AI 提效实战:从 0 到 1 打造团队专属 AI 代码评审工具
前端·人工智能·ai
支付宝体验科技2 小时前
Ant Design Pro v6.0.0 发布
前端
T畅N2 小时前
审批流设计器(前端)
前端·elementui·vue·html·流程图·js
AlunYegeer2 小时前
JAVA,以后端的视角理解前端。在全栈的路上迈出第一步。
java·开发语言·前端
IT_陈寒2 小时前
Redis这个内存杀手,差点让我们运维半夜追杀我
前端·人工智能·后端
hixiong1233 小时前
C# OpenvinoSharp使用DINOv2模型进行图像相似度计算
开发语言·c#