内容简介:最近自己也在用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 知识
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 更加灵活的参数校验,Spring-boot自定义参数校验注解
- 一坨一坨的 if/else 参数校验,终于被 Spring Boot 参数校验组件整干净了
- 【快学springboot】4.接口参数校验
- Spring校验@RequestParams和@PathVariables参数
- SpringBoot 实战 (十五) | 服务端参数校验之一
- 我是怎么进行SpringMVC参数校验的?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。