gin - validator 参数校验

栏目: IT技术 · 发布时间: 5年前

内容简介:最近自己也在用gin框架做项目,然后在群里也有人问关于,参数验证的问题,今天有时间正好研究一下。至此,工作结束,我们可以愉快的使用

最近自己也在用gin框架做项目,然后在群里也有人问关于,参数验证的问题,今天有时间正好研究一下。

gin版本 : v1.6.2

基本验证

  • 定义参数绑定结构体 account_io.go

    package controller
    type Register struct {
        Mobile   uint   `json:"mobile" binding:"required"`
        Password string `json:"password" binding:"required,gte=6"`
    }
  • 将相求参数与结构体绑定 account.go

    package controller
    
    import (
        "fmt"
        "mid-anding/pkg"
    
        "github.com/gin-gonic/gin"
    )
    
    type AccountController struct {
    }
    
    // Register 账户注册
    func (ctl *AccountController) Register(c *gin.Context) {
        var (
            err error
            req Register
        )
        if err = pkg.ParseRequest(c, &req); err != nil {
            return
        }
    
        fmt.Printf("%+v\n", req)
    }

    pkg.ParseRequest 这是对gin自带参数绑定的封装 request.go ,具体代码如下

    package pkg
    func ParseRequest(c *gin.Context, request interface{}) error {
        err := c.ShouldBind(request)
    
        if err != nil {
            c.JSON(200, app.Resp{
                Code: 10004,
                Msg:  err.Error(),
            })
            return err
        }
        return nil
    }

    OK,第一阶段的验证算是完成了,具体的验证参数可以查看 package validator

自定义验证函数

  • 定义验证函数 define.go

    package vali
    
    import (
        "strconv"
        "strings"
    
        "github.com/gin-gonic/gin/binding"
        "github.com/go-playground/validator/v10"
    )
    
    var v *validator.Validate
    var trans ut.Translator
    
    func InitVali() {
        v, ok := binding.Validator.Engine().(*validator.Validate)
        if ok {
            // 自定义验证方法
            v.RegisterValidation("checkMobile", checkMobile)
        }
    }
    func checkMobile(fl validator.FieldLevel) bool {
        mobile := strconv.Itoa(int(fl.Field().Uint()))
        if len(mobile) != 11 {
            return false
        }
        return true
    }
  • 加载,在 main.go 中进行加载

    vali.InitVali() // 字段验证
  • 准备工作完成,接下来让我们来使用他

    package controller
    
    type Register struct {
        Mobile   uint   `json:"mobile" binding:"required,checkMobile"`
        Password string `json:"password" binding:"required,gte=6"`
    }

    这个阶段已经完成,我们可以满足我们常见的参数验证场景了,但是还不够完美,哪里不够完美呢,提示信息,现在我们看到的提示信息是英文的,身为一个中国人,我们当然要提示中文才显得更加友好,所以接下来我们做汉化展示。

错误提示信息汉化

  • 改造完 defind.go 如下

    package vali
    
    import (
        "strconv"
        "strings"
    
        "github.com/gin-gonic/gin/binding"
        zhongwen "github.com/go-playground/locales/zh"
        ut "github.com/go-playground/universal-translator"
        "github.com/go-playground/validator/v10"
        zh_translations "github.com/go-playground/validator/v10/translations/zh"
    )
    
    var v *validator.Validate
    var trans ut.Translator
    
    func InitVali() {
        // 中文翻译
        zh := zhongwen.New()
        uni := ut.New(zh, zh)
        trans, _ = uni.GetTranslator("zh")
    
        v, ok := binding.Validator.Engine().(*validator.Validate)
        if ok {
            // 验证器注册翻译器
            zh_translations.RegisterDefaultTranslations(v, trans)
            // 自定义验证方法
            v.RegisterValidation("checkMobile", checkMobile)
        }
    }
    func Translate(errs validator.ValidationErrors) string {
        var errList []string
        for _, e := range errs {
            // can translate each error one at a time.
            errList = append(errList, e.Translate(trans))
        }
        return strings.Join(errList, "|")
    }
    
    func checkMobile(fl validator.FieldLevel) bool {
        mobile := strconv.Itoa(int(fl.Field().Uint()))
        if len(mobile) != 11 {
            return false
        }
        return true
    }
  • 改造 request.go ,代码如下

    package pkg
    
    import (
        "mid-anding/pkg/vali"
    
        "github.com/gin-gonic/gin"
        "github.com/gin-gonic/gin/binding"
        "github.com/go-playground/validator/v10"
    )
    
    func ParseRequest(c *gin.Context, request interface{}) error {
        err := c.ShouldBind(request)
    
        if err != nil {
            c.JSON(200, app.Resp{
                Code: 10004,
                Msg:  vali.Translate(err.(validator.ValidationErrors)),
            })
            return err
        }
        return nil
    }

至此,工作结束,我们可以愉快的使用 gin 自带的参数绑定验证了。

欢迎关注我们的微信公众号,每天学习 Go 知识

gin - validator 参数校验

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Node.js开发指南

Node.js开发指南

郭家寶(BYVoid) / 人民邮电出版社 / 2012-7 / 45.00元

Node.js是一种方兴未艾的新技术,诞生于2009年。经过两年的快速变化,Node.js生态圈已经逐渐走向稳定。Node.js采用了以往类似语言和框架中非常罕见的技术,总结为关键词就是:非阻塞式控制流、异步I/O、单线程消息循环。不少开发者在入门时总要经历一个痛苦的思维转变过程,给学习带来巨大的障碍。 而本书的目的就是帮助读者扫清这些障碍,学会使用Node.js进行Web后端开发,同时掌握事件驱......一起来看看 《Node.js开发指南》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具