Gin 接收前端传参几种方式小结

 更新时间:2026年03月27日 08:25:53   作者:我叫黑大帅  
本文主要介绍了Gin 接收前端传参几种方式小结,包括路径参数、查询字符串、表单数据、JSON数据和文件上传,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

路径参数(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

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

  • 参数:

    • file:c.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/1)c.Param()
Query 参数GET 请求筛选、分页c.Query() / c.DefaultQuery()
Form 表单传统网页表单提交c.PostForm() / c.DefaultPostForm()
JSON 数据前后端分离、复杂数据c.ShouldBindJSON()
文件上传头像、附件上传c.FormFile() / c.SaveUploadedFile()

到此这篇关于Gin 接收前端传参几种方式小结的文章就介绍到这了,更多相关Gin 接收前端传参内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 一文详解如何在Golang中实现JWT认证与授权

    一文详解如何在Golang中实现JWT认证与授权

    在现代Web应用中,安全性是一个非常重要的课题,JWT作为一种常用的认证与授权机制,已被广泛应用于各种系统中,下面我们就来看看如何在Golang中实现JWT认证与授权吧
    2025-03-03
  • GoLang之标准库encoding/json包

    GoLang之标准库encoding/json包

    本文主要介绍了GoLang之标准库encoding/json包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Golang初始化MySQL数据库方法浅析

    Golang初始化MySQL数据库方法浅析

    这篇文章主要介绍了Golang初始化MySQL数据库的方法,数据库的建立第一步即要初始化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-05-05
  • 浅析Go语言中的方法集合与选择receiver类型

    浅析Go语言中的方法集合与选择receiver类型

    这篇文章主要为大家详细介绍了Go语言中的方法集合与选择receiver类型的相关知识,文中的示例代码讲解详细,对我们深入学习go语言有一定的帮助,需要的可以参考下
    2023-11-11
  • Golang合并yaml文件过程逐步讲解

    Golang合并yaml文件过程逐步讲解

    之前一直从事java开发,习惯了使用yaml文件的格式,尤其是清晰的层次结构、注释,下面这篇文章主要给大家介绍了关于Golang合并yaml文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • golang简单tls协议用法完整示例

    golang简单tls协议用法完整示例

    这篇文章主要介绍了golang简单tls用法,分析了tls协议的使用步骤及客户端与服务器端的相关实现代码,需要的朋友可以参考下
    2016-07-07
  • 解决Golang小数float64在实际工程中加减乘除的精度问题

    解决Golang小数float64在实际工程中加减乘除的精度问题

    这篇文章主要介绍了解决Golang小数float64在实际工程中加减乘除的精度问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Ubuntu安装Go语言运行环境

    Ubuntu安装Go语言运行环境

    由于最近偏爱Ubuntu,在加上作为一门开源语言,在Linux上从源代码开始搭建环境更让人觉得有趣味性。让我们直接先从Go语言的环境搭建开始
    2015-04-04
  • Golang中gorm无法将字段更新为空值

    Golang中gorm无法将字段更新为空值

    本文主要介绍了Golang中gorm无法将字段更新为空值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Golang中make与new使用区别小结

    Golang中make与new使用区别小结

    Go语言中new和make是内建的两个函数,主要用来创建分配类型内存,本文主要给大家介绍了Go语言中函数new与make的使用和区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01

最新评论