Gin Web 框架中 Validate 使用总结

Gin Web 框架中 Validate 使用总结

Jun 7, 2020
Go

在处理 HTTP 请求的时候,需要经常对请求的参数做 validate 验证,在 Django 框架里有 Serializer 里的 validate 方法来做校验,现在在 Go 语言的 Gin 框架下,也有类似的实现。Gin 使用了 go-playground/validator 来做校验,下面主要介绍下使用方法。

binding #

即绑定,validator 使用 bindingvalidate 作为 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"`
}

也可以参考官方的例子

本文以 CC 署名-非商业性使用-禁止演绎 4.0 国际 协议进行许可。

上一篇:Go 程序取消子 Goroutine 的几种方式

下一篇:Go 语言中 Goroutine 的并发数量控制