Gin Web 框架中 Validate 使用总结

6月 7, 2020
Golang
注意:此文章已超过 1 年未更新,部分信息可能已经过时。

在处理 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"`
}

也可以参考官方的例子

本文共 744 字,上次修改于 Feb 8, 2025,以 CC 署名-非商业性使用-禁止演绎 4.0 国际 协议进行许可。

相关文章

» Go 程序取消子 Goroutine 的几种方式

» Go 标准库中涉及 I/O 操作的几个包的区别