为了能够更方便的获取请求相关参数,提高开发效率,gin框架提供了Bind系列方法。
分类
Bind系列方法大致分两类:
- Should类型
- Must类型
二者的区别就是:should和must的区别,即must绑定失败会报错
关系图
Should类型
Must类型
ShouldBindBodyWith
假设有这样的场景:
- 请求体中的数据分为:校验用数据和接口用数据
- 校验用数据绑定给auth中间件的结构体,api用数据绑定为api结构体
- 一个请求上下分则需要绑定两次,但request.Body只可读取一次
此时,shouldBindBodyWith就应用而生:
- ShouldBindBodyWith is similar with ShouldBindWith, but it stores the request
body into the context, and reuse when it is called again. - 将request.body再次存储在上下文中
- 后续调用都得使用该方法
校验器
- gin框架使用github.com/go-playground/validator进行参数校验。
- 文档:validator
- github:validator
简单示例
type SignUpParam struct {
Age uint8 `json:"age" binding:"gte=1,lte=130"`
Name string `json:"name" binding:"required"`
Email string `json:"email" binding:"required,email"`
Password string `json:"password" binding:"required"`
RePassword string `json:"re_password" binding:"required,eqfield=Password"`
Date string `json:"date" binding:"required,datetime=2006-01-02`
}
此时,若gin的Bind方法会根据binding
标签校验字段
自定义校验器
- 定义校验规则
func customFunc(fl validator.FieldLevel) bool {
date, err := time.Parse("2006-01-02", fl.Field().String())
if err != nil {
return false
}
if date.Before(time.Now()) {
return false
}
return true
}
- 注册到validator引擎中
func InitTrans(locale string) (err error) {
// 修改gin框架中的Validator引擎属性,实现自定制
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
// 在校验器注册自定义的校验方法(名字,校验钩子)
if err := v.RegisterValidation("checkDate", customFunc); err != nil {
return err
}
}