4.2. 表单验证器
简介
基于 gin 框架验证参数, 绑定参数优化的验证器
路由验证
在 gin-pro 中使用验证器非常简单, 只分两步完成即可, 且不分开发顺序
1. 路由添加验证器
func LoadDemoRouter(e *gin.Engine) {
d := e.Group("/open/demo").Use(cors.Next())
{
// demo.NewIndexValidator().CheckParams 为验证器
// open.NewDemoController().Index 为控制器
d.GET("/index", demo.NewIndexValidator().CheckParams, open.NewDemoController().Index)
}
}
2. 自定义验证规则
用户根据需求场景在app/http/validator
自定义验证器类, 并实现CheckParams
方法, 在标签binding
中使用验证规则, 多个验证规则之间使用,
分割, 即可完成验证
type IndexValidator struct {
Id float64 `form:"id" json:"id" binding:"required,min=1"` // 必填,最小值为1
}
func (c IndexValidator) CheckParams(context *gin.Context) {
if err := context.ShouldBind(&c); err != nil {
response.ValidatorError(context, err)
return
}
if http.BindContext(c, consts.Param, context) == nil {
response.ErrorSystem(context, " index 表单验证器json化失败", "")
} else {
context.Next()
}
}
验证通过后把参数绑定到 context
中, 在 controller
中直接使用 context
获取参数
func (d DemoController) Index(c *gin.Context) {
id := c.GetInt(consts.Param + "id")
fmt.Printf("参数值为 : %d", id)
}
控制器验证
如果你不喜欢这种方法, 也可以在控制器定义一个结构体, 在获取参数前验证:
注意在验证失败后 response
后要有return
否则代码会继续执行
if err := context.ShouldBind(&c); err != nil {
response.ValidatorError(context, err)
return
}
公共参数
在app/http/validator/common_data
中预制了一些常用验证规则, 分页参数, ID 参数 使用方法:
type IndexValidator struct {
common_data.IntId
}
验证规则
required | 这将验证该值不是数据类型的默认零值。数字不为0,字符串不为 “ “, slices, maps, pointers, interfaces, channels and functions 不为 nil |
---|---|
isdefault | 这验证了该值是默认值,几乎与所需值相反。 |
structonly | 当遇到嵌套结构的字段并包含此标志时,将运行嵌套结构上的任何验证,但不会验证任何嵌套结构字段。如果您在程序内部知道结构有效,但需要验证它是否已分配,这非常有用。注意:结构本身只能使用“required”和“omitempty”。 |
nostructlevel | 与structonly标记相同,但不会运行任何结构级别验证。 |
omitempty | 允许条件验证,例如,如果字段未设置值(由“required”验证器确定),则其他验证(如min或max)将不会运行,但如果设置了值,则验证将运行。 |
dive | 这告诉验证者潜入切片,数组或映射,并使用后面的验证标记验证切片,数组或映射的该级别。还支持多维嵌套,您希望dive的每个级别都需要另一个dive标签。dive有一些子标签,’keys’和’endkeys’,请参阅下面的keys和endkeys部分 |
len=10 | 对于数字,长度将确保该值等于给定的参数。对于字符串,它会检查字符串长度是否与字符数完全相同。对于切片,数组和map,验证元素个数。 |
max=10 | 对于数字,max将确保该值小于或等于给定的参数。对于字符串,它会检查字符串长度是否最多为该字符数。对于切片,数组和map,验证元素个数。 |
min=10 | |
eq | 对于字符串和数字,eq将确保该值等于给定的参数。对于切片,数组和map,验证元素个数。 |
ne | 和eq相反 |
oneof=red green (oneof=5 7 9) | 对于字符串,整数和uint,oneof将确保该值是参数中的值之一。参数应该是由空格分隔的值列表。值可以是字符串或数字。 |
gt=10 | 对于time.Time确保时间值大于time.Now.UTC() |
gte=10 | 大于等于 |
gte | 对于time.Time确保时间值大于或等于time.Now.UTC() |
lt=10 | 小于 |
lt | 对于time.Time确保时间值小于time.Now.UTC() |
lte=10 | 小于等于 |
lte | 对于time.Time确保时间值小于等于time.Now.UTC() |
unique | 对于数组和切片,unique将确保没有重复项。对于map,unique将确保没有重复值。 |
alpha | 这将验证字符串值是否仅包含ASCII字母字符 |
ip | 这将验证字符串值是否包含有效的IP地址 |
latitude | 这将验证字符串值是否包含有效的纬度。 |
longitude | 这将验证字符串值是否包含有效经度。 |
电子邮件 |
推荐文章: