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

本文介绍了Go语言中用于表单验证的各种内置验证器,包括字符串、数字、字段、数组和日期的验证规则。同时,展示了如何自定义验证器以及处理验证错误的方法,例如在用户注册场景中绑定和校验用户数据。还提到了Gin框架中处理HTTP请求的示例。
摘要由CSDN通过智能技术生成

常用验证器

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

Gin 框架中,使用 `binding` 标签可以对表单输入进行验证。下面是一个 Gin 框架表单输入验证的使用示例: 1. 导入 gin 包 ``` import "github.com/gin-gonic/gin" ``` 2. 创建一个结构体,定义表单输入 ``` type LoginForm struct { Username string `form:"username" binding:"required"` Password string `form:"password" binding:"required"` } ``` 3. 在路由处理函数中使用验证 ``` func loginHandler(c *gin.Context) { var form LoginForm if err := c.ShouldBind(&form); err != nil { c.HTML(http.StatusBadRequest, "login.html", gin.H{ "error": err.Error(), }) return } // TODO: 处理登录逻辑 } ``` 4. 创建一个 HTML 模板,定义表单 ``` <!DOCTYPE html> <html> <head> <title>Login</title> </head> <body> {{ if .error }} <p style="color: red;">{{ .error }}</p> {{ end }} <form method="POST" action="/login"> <label for="username">Username:</label> <input type="text" name="username" id="username"><br> <label for="password">Password:</label> <input type="password" name="password" id="password"><br> <input type="submit" value="Login"> </form> </body> </html> ``` 5. 启动服务 ``` func main() { r := gin.Default() r.LoadHTMLGlob("templates/*") r.GET("/login", func(c *gin.Context) { c.HTML(http.StatusOK, "login.html", gin.H{}) }) r.POST("/login", loginHandler) r.Run(":8080") } ``` 这样,当用户提交登录表单时,会先对表单输入进行校验,如果输入不符合要求,则返回错误信息;如果输入符合要求,则继续处理登录逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值