Gin Web 框架中 Validate 使用总结
6月 7, 2020
在处理 HTTP 请求的时候,需要经常对请求的参数做 validate 验证,在 Django 框架里有 Serializer 里的 validate
方法来做校验,现在在 Go 语言的 Gin 框架下,也有类似的实现。Gin 使用了 go-playground/validator 来做校验,下面主要介绍下使用方法。
binding #
即绑定,validator 使用 binding
或 validate
作为 tag 标识来进行校验。
// Binding from JSON
type Login struct {
User string `form:"user" json:"user" xml:"user" binding:"required"`
Password string `form:"password" json:"password" xml:"password" binding:"required"`
}
官方文档列了非常全的校验关键字,这里来举一些比较常用的例子,先有一个初步认识。
type User struct {
Username string `json:"username" binding:"required"`
Email string `json:"email" binding:"email"`
Password string `json:"password" binding:"min=8,max=255"`
Bio string `json:"bio" binding:"max=1024"`
Image string `json:"image" binding:"omitempty,url"`
}
Tag标签 | 说明 |
---|---|
required | 必填且必须有值,如果要避免值可能为空的报错,可以用 omitempty |
unique | 保证唯一性,不同类型处理不同;对于map,unique 约束没有重复的value 值;对于数组和切片,没有重复的元素值 |
min | 最小值,不同类型含义不一样,数字类型代表最小值,字符串型代表最小字符数。 |
max | 最大值,不同类型含义不一样,数字类型代表最大值,字符串型代表最大字符数。 |
gte | 大于等于参数值 |
gt | 大于参数值 |
lt | 小于参数值 |
lte | 小于d等于参数值 |
email | 使用email 来限制字段必须是邮件形式 |
oneof | 必须是指定值的其中一个,如:oneof=男 女 ,即参数值只能填男或女 |
相关的 tag 太多了,可以直接参考官方文档,下面再着重说几个。
dive #
一般用在 slice、array、map、嵌套的 struct 验证中,作为分隔符表示进入里面一层的验证规则。dive
之前是外层的校验,dive
之后是内层的校验。
omitempty #
请求参数里的字段为空时或不填时会忽略掉这个字段,在 bind 成结构体的时候,对应的值为 nil
。
自定义 validator #
可能在业务开发中还有一些标准库无法满足的校验,需要自定义 validator 了,是一个很常见的场景。这里介绍下如何编写自定义的 validator。
第一步:定义规则
func CustomValidate(fl validator.FieldLevel) bool {
return strings.HasPrefix(fl.Field().String(), "cn")
}
第二步:注册规则
func main() {
route := gin.Default()
// 注册 validator
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("prefix", CustomValidate)
}
route.GET("/post", PostMethod)
route.Run()
}
第三步:在结构体里使用
type User struct {
Username string `json:"username" binding:"required,prefix"`
}
也可以参考官方的例子。