gin - validator 参数校验

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

内容简介:最近自己也在用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 参数校验

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

查看所有标签

猜你喜欢:

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

C语言深度解剖

C语言深度解剖

陈正冲 / 北京航空航天大学出版社 / 2010-7 / 29.00元

《C语言深度解剖:解开程序员面试笔试的秘密》由作者结合自身多年嵌入式c语言开发经验和平时讲解C语言的心得体会整理而成,其中有很多作者独特的见解或看法。由于并不是从头到尾讲解C语言的基础知识,所以《C语言深度解剖:解开程序员面试笔试的秘密》并不适用于C语言零基础的读者,其内容要比一般的C语言图书深得多、细致得多,其中有很多问题是各大公司的面试或笔试题。 《C语言深度解剖:解开程序员面试笔试的秘......一起来看看 《C语言深度解剖》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具