常用验证器
//针对字符串
required:必填
min:最小值
max:最大值
len:长度
//针对数字
eq:=
nq:!=
gt:大于
gte:大于等于
lt:小于
lte:小于等于
//针对字段
eqfield:等于其它字段的值;如:
Password string
RePassword string `binding:"eqfield=Password"`//匹配密码是否相等
nefield:不等于其他字段
内置验证器
//枚举
oneof=red pink//只能是red或者pink
//字符串
contains=liangxin//包含liangxin的字符串
excludes//不包含
startswith//字符串前缀
endswith//字符串后缀
//数组
dive//后面验证的就是数组中的每一个元素
//网格验证
ip
ipv4
ipv6
url:http://baidu.com/123/12/456
uri:/123/12/456
//日期验证
datetime=2006-01-02
自定义验证错误信息
type User struct {
Name string `json:"name" binding:"required,min=6,max=12" msg:"名字不能为空且长度在6-12之间" form:"name"`
Age int `json:"age" binding:"required,min=1,max=99" msg:"年龄不能为空且必须在1-99之间" form:"age"`
Email string `json:"email" binding:"required,email" msg:"不能为空并且必须为邮箱格式" form:"email"`
Phone string `json:"phone" binding:"required,len=11" msg:"电话号码不能为空且必须为11位" form:"phone"`
Sex string `json:"sex" binding:"oneof=man"`
}
/*
*
获取结构体中的msg
*/
func GetErrorData(err error, obj any) string {
getObt := reflect.TypeOf(obj)
//将err断言为具体类型
if errs, ok := err.(validator.ValidationErrors); ok {
//断言成功
for _, e := range errs {
//根绝报错字段名,获取结构体具体字段
if f, exists := getObt.Elem().FieldByName(e.Field()); exists {
msg := f.Tag.Get("msg")
return msg
}
}
}
return ""
}
/*
*
参数校验
*/
func (con UserController) BindUserData(c *gin.Context) {
var userinfo User
err := c.ShouldBindJSON(&userinfo)
if err != nil {
c.JSON(200, gin.H{"msg": GetErrorData(err, &userinfo)})
return
}
c.JSON(200, userinfo)
}
自定义验证器
//校验结构体
type Artcle struct {
Title string `json:"title" binding:"sign" msg:"标题校验失败"`//sign为自定义得验证器
Content string `json:"content" binding:"required"`
}
func signValid(fl validator.FieldLevel) bool {
var namelist []string = []string{"liangxin", "liushiyu", "liuyufei"}
for _, nameStr := range namelist {
name := fl.Field().Interface().(string)
if nameStr == name {
return false
}
}
return true
}
//创建的默认路由引擎
r := gin.Default()
//自定义验证器
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("sign", signValid)
}