文章目录
- 前言
- 一、基础用法
- 二、常用字段说明
- 常用字段说明
- 1. `required`
- 2. `len`
- 3. `min` 和 `max`
- 4. `gte` 和 `lte` 、 `gt` 和 `lt` 、`ne`
- 5. `oneof`
- 6. `email`
- 7. `url`
- 三、示例代码
- 运行效果
- 总结
前言
在 Go 中使用 Gin 框架时,BindJSON 可以将 JSON 请求体中的数据绑定到结构体上,配合 binding 标签还可以进行验证。其主要是通过validator
库实现
在Gin的bind/json.go
文件中可以看到
validator方法是https://github.com/go-playground/validator/tree/v10.6.1
包中的。
所以实际上,gin中binding 验证的方法是使用validator
实现的
这样可以快速的实现多种验证条件,而不需要额外的去写验证方法。
Gin 支持多种验证规则,可以通过 binding 标签在结构体字段上定义。下面我们来看一下有哪些验证方法吧。
一、基础用法
假设我们有一个 User 结构体来接收 JSON 数据:
request.go
type User struct {ID string `json:"id" binding:"required"` // 必须字段Age int `json:"age" binding:"gte=0,lte=130"` // 年龄范围Email string `json:"email" binding:"required,email"` // 必须是合法的电子邮件地址Password string `json:"password" binding:"min=8"` // 密码至少8字符
}
controller.go
req := &User{}
if err := c.BindJson(req); err != nil {fmt.Println(err)return
}
在BindJson
中,如果验证有问题则会报出err错误,并显示详细的错误原因。
二、常用字段说明
常用字段说明
1. required
- 用法:
binding:"required"
- 说明:字段必须存在,不能为空。
- 示例:
Name string `json:"name" binding:"required"`
2. len
- 用法:
binding:"len=xx"
- 说明:验证字符串、数组或切片的长度是否等于指定长度。
- 示例:
Code string `json:"code" binding:"len=6"` // 长度必须为 6
3. min
和 max
- 用法:
binding:"min=xx"
和binding:"max=xx"
- 说明:适用于数字和字符串;对于数字,限制最小或最大值;对于字符串,限制最小或最大字符数。
- 示例:
Age int `json:"age" binding:"min=1,max=100"`
4. gte
和 lte
、 gt
和 lt
、ne
- 用法:
binding:"gte=xx"
和binding:"lte=xx"
- 说明:
gte
表示“greater than or equal”(大于等于),lte
表示“小于等于”。ne
表示不等于。常用于数字和时间。 - 示例:
Age int `json:"age" binding:"gte=18,lte=65"`
5. oneof
- 用法:
binding:"oneof=xx xx xx"
- 说明:验证字段值必须是列表中的一个,常用于枚举值。
- 示例:
Status int `json:"status" binding:"oneof=0 1 2"`
6. email
- 用法:
binding:"email"
- 说明:验证字段是否是有效的电子邮件格式。
- 示例:
Email string `json:"email" binding:"required,email"`
7. url
- 用法:
binding:"url"
- 说明:验证字段是否为有效的 URL。
- 示例:
Website string `json:"website" binding:"url"`
三、示例代码
使用 BindJSON
并配合 binding
标签验证请求体数据的完整示例:
package mainimport ("github.com/gin-gonic/gin""net/http"
)type User struct {ID string `json:"id" binding:"required"`Age int `json:"age" binding:"gte=0,lte=130"`Email string `json:"email" binding:"required,email"`Password string `json:"password" binding:"min=8"`
}func main() {router := gin.Default()router.POST("/user", func(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// Process user datac.JSON(http.StatusOK, gin.H{"status": "User validated and processed"})})router.Run(":8080")
}
运行效果
当发送带有错误字段的 JSON 请求时,会自动返回相应的错误信息,例如:
{"error": "Key: 'User.Email' Error:Field validation for 'Email' failed on the 'email' tag"
}
总结
- 使用
binding
标签定义验证规则,简洁且自动验证请求数据。 ShouldBindJSON
/BindJSON
可将错误自动绑定到结构体。- 若请求字段验证失败,Gin 会返回详细的错误消息。
本文是经过个人查阅相关资料后理解的提炼,可能存在理论上理解偏差的问题,如果您在阅读过程中发现任何问题或有任何疑问,请不吝指出,我将非常感激并乐意与您讨论。谢谢您的阅读!