【gin】模型绑定、参数验证及文件上传go案例演示

devtools/2025/1/18 22:31:19/

Gin 框架参数绑定与验证

在开发 Web 应用时,通常需要处理来自客户端的请求数据。Gin 提供了强大的 请求绑定(Binding)参数验证(Validation) 功能。

1. Gin 请求数据绑定

Gin 使用 ShouldBindShouldBindJSON 等方法来将请求中的数据绑定到 Go 结构体中。根据请求的 Content-Type,Gin 会自动选择合适的绑定方式。

常见绑定方法:

  • ShouldBindJSON:用于绑定 application/json 格式的请求体。

  • ShouldBind:是一个通用绑定方法,能够根据请求类型(如 application/jsonapplication/x-www-form-urlencoded)自动选择合适的绑定方式。

  • c.Param:用于获取 URL 路径中的参数(如 /course/:id)。
    在这里插入图片描述

  • c.Query:用于获取 URL 查询参数(如 /course?id=1)。
    在这里插入图片描述

2. Gin 参数验证

Gin 提供了参数验证功能,通过 验证标签 来约束结构体字段的值。结构体中的字段可以使用标签来进行验证,如 requiredemailnumber 等。

常见验证标签:

标签说明
required表示该字段是 必填 的,不能为空
omitempty表示该字段是 可选 的,如果请求中没有提供该字段,则不验证
alphaunicode该字段只能包含 字母和 Unicode 字符
number该字段必须是一个 数字
e164该字段必须符合 E.164 国际电话号码格式
email该字段必须是有效的 电子邮件地址

结构字段验证参考github

例子:

type user struct {Name   string `json:"name" binding:"required,alphaunicode"`Age    int    `json:"age" binding:"omitempty,number"`Phone  string `json:"phone" binding:"omitempty,e164"`Email  string `json:"email" binding:"omitempty,email"`
}
  • Name:要求字段不能为空,并且只能包含字母和 Unicode 字符。
  • Age:可选字段,要求是数字类型。
  • Phone:可选字段,要求符合 E.164 格式。
  • Email:可选字段,要求是有效的电子邮件地址。

3. Gin 的错误处理与返回

在验证过程中,Gin 会自动处理错误并返回相应的 HTTP 状态码和错误信息。

bind和shouldBind区别

  • Bind 不会根据请求类型返回错误,只要请求体能够成功转换为结构体,它就会执行绑定。
  • bind尝试绑定请求体到结构体,并且如果出错,会返回 HTTP 400 错误,并继续执行后续代码
  • 而shouldBind会返回500,不会继续执行

错误处理:

err := c.ShouldBind(&req)
if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error(),})return
}

1.使用bind情况
![在在这里插入图片描述
2.使用shouldbind
在这里插入图片描述

4. 文件上传

package uploadimport ("github.com/gin-gonic/gin""net/http"
)// Upload 上传单个文件
func Upload(c *gin.Context) {file, _ := c.FormFile("file") // 这里file指的是字段名dst := "upload_files/" + file.Filenamec.SaveUploadedFile(file, dst)c.JSON(http.StatusOK, gin.H{"file": file.Filename,})
}// UploadMultiple 上传多个文件
func UploadMultiple(c *gin.Context) {form, _ := c.MultipartForm()files := form.File["files"] // 从表单中获取文件,参数名为 "file"// 这是从请求中提取文件的函数。file 是前端表单中 <input type="file" name="file"> 的 name 属性值。// 通过 FormFile,我们可以获得上传文件的信息,比如文件名、大小、类型等。fileNames := make([]string, len(files))for i := 0; i < len(files); i++ {file := files[i]dst := "upload_files/" + file.Filenamec.SaveUploadedFile(file, dst) // 保存文件到指定路径fileNames[i] = file.Filename}c.JSON(http.StatusOK, gin.H{"files": fileNames,})
}

设置最大上传文件大小

package main  import (  "github.com/gin-gonic/gin"   "golang13-gin/routes"   
)func main() {   r := gin.Default()   r.MaxMultipartMemory = 8 << 20 // r.MaxMultipartMemory = 8 << 20 是设置 gin.Engine 的一个配置选项,控制上传文件时的最大内存限制。// 指的是单次上传内所有文件大小   routes.InitRoutes(r)   r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")}

路由配置

package routesimport ("github.com/gin-gonic/gin""golang13-gin/upload"
)func InitUpload(group *gin.RouterGroup) {v1 := group.Group("v1"){v1.POST("/upload", upload.Upload)v1.POST("/uploadMulti", upload.UploadMultiple)}
}

https://github.com/0voice


http://www.ppmy.cn/devtools/151674.html

相关文章

为AI聊天工具添加一个知识系统 之46 蒙板程序设计(第一版):Facet六边形【意识形态:操纵】

本文要点 要点 (原先标题冒号后只有 “Facet”后改为“Face六边形【意识形态】” &#xff0c;是 事后想到的&#xff0c;本文并未明确提出。备忘在这里作为后续的“后期制作”的备忘) 前面讨论的&#xff08;“之41 纯粹的思维”&#xff09;中 说到&#xff0c;“意识”三…

相机拍照参数:WB、FF、S、ISO、EV、焦距

WB&#xff08;白平衡&#xff0c;White Balance&#xff09;&#xff1a; 白平衡用于去除不真实的色彩偏移&#xff0c;调整照片的颜色以确保白色在不同光源下都呈现为白色。不同的光源有不同的色温&#xff08;例如日光、钨丝灯、荧光灯等&#xff09;&#xff0c;这会影响照…

springBoot连接远程Redis连接失败(已解决)

问题: 首先&#xff0c;我是先用jedis进行的redis连接&#xff0c;成功连接&#xff0c;没有任何问题&#xff0c;说明redis配置&#xff0c;以及访问地址、端口、密码都是正确的。 我的yml文件配置如下&#xff1a; spring:redis:host: 远程ip地址port: 6379password: 密码…

Android 12.0 息屏休眠后立即启动屏保功能实现

1.前言 在12.0的系统rom定制化开发中,在进行一些关于自定义屏保功能中,产品需要再息屏休眠的时候启动屏保功能,接下来 就需要分析监听息屏休眠的时候,启动屏保功能实现 2.息屏休眠后立即启动屏保功能实现的核心类 frameworks/base/services/core/java/com/android/serve…

【数据结构-堆】【hard】力扣23. 合并 K 个升序链表

给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组如下&#…

冯·诺依曼体系结构:计算机科学的奠基石

文章目录 前言&#x1f3b7;一、冯诺依曼体系结构&#xff08;Von Neumann Architecture&#xff09;&#x1f3b8;1.1 硬件介绍&#x1f941;1. 输入设备&#x1f941;2. 输出设备&#x1f941;3. 输入输出一体化设备&#x1f941;4. 存储器&#x1f941;5. 中央处理器CPU&…

登录、注册、忘记密码、首页HTML模板

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登录</title><style>body {display: fl…

抖音矩阵是什么

抖音矩阵是指在同一品牌或个人IP下&#xff0c;通过创建多个不同定位的抖音账号&#xff08;如主号、副号、子号等&#xff09;&#xff0c;形成一个有机的整体&#xff0c;以实现多维度、多层次的内容覆盖和用户互动。以下是关于抖音矩阵的详细介绍&#xff1a; 抖音矩阵的类…