gin框架学习记录——验证器

常用验证器

//针对字符串
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)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值