3_请求参数绑定与多数据格式处理.md
Gin请求参数绑定与多数据格式处理
目录
表单实体绑定(参数绑定)
使用PostForm这种单个获取属性和字段的方式,代码量较多,需要一个一个属性进行获取。gin框架提供了数据结构体和表单提交数据绑定的功能,提高表单数据获取的效率:
type UserRegister struct { Username string `form:"username" binding:"required"` Phone string `form:"phone" binding:"required"` Password string `form:"password" binding:"required"` }
ShouldBindQuery()
使用ShouldBindQuery可以实现Get方式的数据请求的绑定。
func func3() { r := gin.Default() r.GET("/hello", func(c *gin.Context) { fmt.Println(c.FullPath()) var student Student // ShouldBind()会根据请求的Content-Type自行选择绑定器 err := c.ShouldBindQuery(&student) if err != nil { log.Fatal(err.Error()) } c.Writer.Write([]byte("hello, " + student.Name + student.Classes)) }) r.Run("localhost:8000") } type Student struct { Name string `form:"name"` Classes string `form:"classes"` }
ShouldBind()
使用ShouldBind可以实现Post方式的提交数据的绑定工作。
ShouldBindJson()
当客户端使用Json格式进行数据提交时,可以采用ShouldBindJson对数据进行绑定并自动解析
参数获取
获取querystring参数
DefaultQuery()
Query()
r.GET("/user/search", func(c *gin.Context) { username := c.DefaultQuery("username", "小王子") //username := c.Query("username") address := c.Query("address") //输出json结果给调用方 c.JSON(http.StatusOK, gin.H{ "message": "ok", "username": username, "address": address, }) })
获取form参数
PostForm()
username := c.PostForm("username") address := c.PostForm("address")
获取json参数
r.POST("/json", func(c *gin.Context) { // 注意:下面为了举例子方便,暂时忽略了错误处理 b, _ := c.GetRawData() // 从c.Request.Body读取请求数据 // 定义map或结构体 var m map[string]interface{} // 反序列化 _ = json.Unmarshal(b, &m) c.JSON(http.StatusOK, m) })
请求的参数通过URL路径传递,例如:/user/search/小王子/沙河
。 获取请求URL路径中的参数的方式如下。
func main() { //Default返回一个默认的路由引擎 r := gin.Default() r.GET("/user/search/:username/:address", func(c *gin.Context) { username := c.Param("username") address := c.Param("address") //输出json结果给调用方 c.JSON(http.StatusOK, gin.H{ "message": "ok", "username": username, "address": address, }) }) r.Run(":8080") }
Gin文件上传
单文件上传
文件上传前端页面代码:
<!DOCTYPE html> <html lang="zh-CN"> <head> <title>上传文件示例</title> </head> <body> <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="f1"> <input type="submit" value="上传"> </form> </body> </html>
后端gin框架部分代码:
gin.Context.FormFile()
func main() { router := gin.Default() // 处理multipart forms提交文件时默认的内存限制是32 MiB // 可以通过下面的方式修改 // router.MaxMultipartMemory = 8 << 20 // 8 MiB router.POST("/upload", func(c *gin.Context) { file, err := c.FormFile("f1") if err != nil { c.JSON(302, gin.H{ "message": err.Error(), }) return } fmt.Println(file.Filename) dst := fmt.Sprintf("./%s", file.Filename) c.SaveUploadedFile(file, dst) c.JSON(200, gin.H{ "message": fmt.Sprintf("'%s' uploaded!", file.Filename), }) }) router.LoadHTMLFiles("./index.html") router.GET("/", func (c *gin.Context) { c.HTML(200, "index.html", "") }) router.Run("localhost:9000") }
多文件上传
gin.Context.MultipartForm()
router.POST("/upload", func(c *gin.Context) { // Multipart form form, _ := c.MultipartForm() files := form.File["file"] for index, file := range files { log.Println(file.Filename) dst := fmt.Sprintf("C:/tmp/%s_%d", file.Filename, index) // 上传文件到指定的目录 c.SaveUploadedFile(file, dst) } c.JSON(http.StatusOK, gin.H{ "message": fmt.Sprintf("%d files uploaded!", len(files)), }) })
本文作者:nsfoxer
本文链接:https://www.cnblogs.com/nsfoxer/p/16317575.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理