412 字
2 分钟
数据验证
基本验证标签
type User struct { // 必填字段 Username string `json:"username" binding:"required"`
// 最小长度 Password string `json:"password" binding:"required,min=6"`
// 最大长度 Nickname string `json:"nickname" binding:"max=20"`
// 长度范围 Code string `json:"code" binding:"len=6"`
// 邮箱格式 Email string `json:"email" binding:"required,email"`
// URL 格式 Website string `json:"website" binding:"url"`
// 数字范围 Age int `json:"age" binding:"gte=0,lte=130"`
// 枚举值 Gender string `json:"gender" binding:"oneof=male female other"`
// IP 地址 IP string `json:"ip" binding:"ip"`
// 日期时间 Birthday time.Time `json:"birthday" binding:"required"`}常用验证标签
type Product struct { // 字符串验证 Name string `binding:"required,min=3,max=100"` Description string `binding:"omitempty,max=500"` SKU string `binding:"required,alphanum"`
// 数字验证 Price float64 `binding:"required,gt=0"` Stock int `binding:"required,gte=0"` Discount float64 `binding:"omitempty,gte=0,lte=100"`
// 数组验证 Tags []string `binding:"required,min=1,max=10,dive,min=2,max=20"`
// 嵌套结构验证 Category Category `binding:"required"`}
type Category struct { ID int `binding:"required,gt=0"` Name string `binding:"required,min=2,max=50"`}自定义验证器
import ( "github.com/gin-gonic/gin/binding" "github.com/go-playground/validator/v10")
// 自定义验证函数func customValidator(fl validator.FieldLevel) bool { value := fl.Field().String() return value == "admin" || value == "user"}
type RegisterForm struct { Username string `json:"username" binding:"required"` Role string `json:"role" binding:"required,customRole"`}
func main() { r := gin.Default()
// 注册自定义验证器 if v, ok := binding.Validator.Engine().(*validator.Validate); ok { v.RegisterValidation("customRole", customValidator) }
r.POST("/register", func(c *gin.Context) { var form RegisterForm
if err := c.ShouldBindJSON(&form); err != nil { c.JSON(http.StatusBadRequest, gin.H{ "error": err.Error(), }) return }
c.JSON(http.StatusOK, gin.H{ "message": "Registration successful", "user": form, }) })
r.Run(":8080")}自定义错误消息
type LoginForm struct { Username string `json:"username" binding:"required"` Password string `json:"password" binding:"required,min=6"`}
func main() { r := gin.Default()
r.POST("/login", func(c *gin.Context) { var form LoginForm
if err := c.ShouldBindJSON(&form); err != nil {
// 自定义错误消息 errors := make(map[string]string)
for _, fieldErr := range err.(validator.ValidationErrors) { field := fieldErr.Field() tag := fieldErr.Tag()
switch field { case "Username": if tag == "required" { errors[field] = "用户名不能为空" } case "Password": if tag == "required" { errors[field] = "密码不能为空" } else if tag == "min" { errors[field] = "密码长度至少为 6 位" } } }
c.JSON(http.StatusBadRequest, gin.H{ "errors": errors, }) return }
c.JSON(http.StatusOK, gin.H{ "message": "登录成功", }) })
r.Run(":8080")}分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
最后更新于 ,距今已过 89 天
部分内容可能已过时