【gin】模型绑定、参数验证及文件上传go案例演示
Gin 框架参数绑定与验证
在开发 Web 应用时,通常需要处理来自客户端的请求数据。Gin 提供了强大的 请求绑定(Binding) 和 参数验证(Validation) 功能。
1. Gin 请求数据绑定
Gin 使用 ShouldBind
和 ShouldBindJSON
等方法来将请求中的数据绑定到 Go 结构体中。根据请求的 Content-Type,Gin 会自动选择合适的绑定方式。
常见绑定方法:
-
ShouldBindJSON
:用于绑定application/json
格式的请求体。 -
ShouldBind
:是一个通用绑定方法,能够根据请求类型(如application/json
、application/x-www-form-urlencoded
)自动选择合适的绑定方式。 -
c.Param
:用于获取 URL 路径中的参数(如/course/:id
)。
-
c.Query
:用于获取 URL 查询参数(如/course?id=1
)。
2. Gin 参数验证
Gin 提供了参数验证功能,通过 验证标签 来约束结构体字段的值。结构体中的字段可以使用标签来进行验证,如 required
、email
、number
等。
常见验证标签:
标签 | 说明 |
---|---|
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 upload
import (
"github.com/gin-gonic/gin"
"net/http"
)
// Upload 上传单个文件
func Upload(c *gin.Context) {
file, _ := c.FormFile("file") // 这里file指的是字段名
dst := "upload_files/" + file.Filename
c.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.Filename
c.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 routes
import (
"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