朋也的博客 » 首页 » 文章

Gin学习笔记 - Validator(验证器)

作者:朋也
日期:2021-02-24
类别:gin学习笔记 


版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

gin里用的验证器是 https://github.com/go-playground/validator

配合着gin里提供的方法,用起来很方便

首先在实体类里定义好要进行什么验证,常用的有

更多验证规则可以去readme里查看 https://github.com/go-playground/validator/blob/master/README.md

修改前面写的 User 结构

type User struct {
    Id       int      `json:"id" gorm:"primaryKey"`
    Name     string   `json:"name" binding:"required"`
    Password string   `json:"password" binding:"required,min=6,max=32"`
    Age      int      `json:"age" binding:"gte=1,lte=120"`
    Info     UserInfo `json:"info" gorm:"-" binding:"required"`
}

type UserInfo struct {
    Bio   string
    Email string `json:"email" binding:"required,email"`
}

可以看到,需要验证的字段,要用 binding 修饰,如果有多个验证规则,中间用英文逗号隔开

注意:这种验证只是针对请求参数的验证,不一定非要写在跟数据库映射关系的结构里,完全可以自定义一个 struct 来接收请求的参数然后制定验证规则

我这里是省事,就写到一块了

下面修改一下接收参数的写法,我这里以保存接口为例

func SaveUser(c *gin.Context) {
    var user model.User
    // 使用 ShouldBind 方法实现字段与结构绑定且进行规则验证
    if err := c.ShouldBind(&user); err == nil {
        c.JSON(http.StatusOK, service.SaveUser(user.Name, user.Password, user.Age))
    } else {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    }
}

如果请求类型是 application/json 且参数是一段json字符串,则使用 c.ShouldBindJson() 方法来接收参数

相应的还有如下一些方法来绑定不同类型的请求参数


自定义一个验证器

在util文件夹里创建一个验证器

package util

import (
    "github.com/gin-gonic/gin/binding"
    "github.com/go-playground/validator/v10"
)

// 初始化时注册验证器
func init() {
    if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
        v.RegisterValidation("myValidator", myValidator)
    }
}

var myValidator validator.Func = func(fl validator.FieldLevel) bool {
    data := fl.Field().(string)
    return data == "ok"
}

这样就可以在结构里使用了,跟用 required, email 等验证器是一样的

type User struct {
    Id       int    `json:"id" gorm:"primaryKey"`
    Name     string `json:"name" binding:"required,myValidator"` // 添加一个自定义的验证器,验证传的name值是否为ok,不为ok时就报错
    Password string `json:"password" binding:"required,min=6,max=32"`
    Age      int    `json:"age" binding:"gte=1,lte=120"`
}