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 这将验证字符串值是否包含有效经度。
email 电子邮件

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~