gin bind(重要)


 

文章目录

  • 一、数据绑定:
    • 1. 数据绑定介绍:
    • 2. 数据绑定--Should bind:
      • 2.1 ShouldBind:
      • 2.2 ShouldBindWith
      • 2.3 ShouldBindQuery等
      • 2.4 ShouldBindUri:绑定 Uri:
    • 3. 数据绑定--Must bind
      • 3.1 Bind
      • 3.2 BindQuery等
  • 二、数据验证:
    • 1. 使用:
    • 2. 其他验证器:
    • 3. 自定义验证器:
      • 3.1 安装:
    • 3.2 定义验证器:
    • 3.3 注册验证器:
    • 3.4 结构体中使用:
    • 4. beego中的验证器:
      • 4.1 安装
    • 4.2 验证方法:
    • 4.3 通过 StructTag校验数据:
      • BindQuery\ShouldBindQuery函数只绑定查询参数,而不绑定POST数据
      • Bind\ShouldBind函数绑定Get 参数,绑定POST数据

https://godoc.org/gopkg.in/go-playground/validator.v8#hdr-Baked_In_Validators_and_Tags

注意:
多个验证器之间用英文输入法下的逗号(,)隔开, 并且是按照验证器的顺序执行的
如果希望在参数中包含逗号(即excludesall =,), 则需要使用UTF-8十六进制表示形式0x2C例如: validate:"excludesall=0x2C"

验证器说明示例
- 忽略字段 binding:"-"
required 必填字段 binding:“required”
min 最小长度 binding:“min=10”
max 最大长度 binding:“max=10”
| binding:"rgb
structonly 如果有嵌套,可以决定只验证结构体上的 binding:“structonly”
omitempty 省略空,如果为空,则不会继续验证该字段上其他的规则,只有不为空才会继续验证其他的  
len 长度 binding:“len=10”
eq 等于 binding:“eq=10”
ne 不等于 binding:“ne=10”
gt 大于 binding:“gt=10”
gte 大于等于 binding:“gte=10”
lt 小于 binding:“lt=10”
lte 小于等于 binding:“lte=10”
eqfield 等于其他字段的值 Password string binding:"eqfield=ConfirmPassword"
nefield 不等于其他字段的值  
eqcsfield 类似eqfield,它会验证相对于顶层结构提供的字段 binding:"eqcsfield = InnerStructField.Field
necsfield    
gtfield 大于其他字段的值  
gtefield    
gtcsfield    
gtecsfield    
ltfield 小于其他字段的值  
ltefield    
ltcsfield    
ltecsfield    
alpha 字符串值仅包含字母字符  
alphanum 字符串值仅包含字母数字字符  
numeric 字符串值包含基本数字值。基本不包括指数等…  
hexadecimal 字符串值包含有效的十六进制  
hexcolor 验证字符串值包含有效的十六进制颜色, 包括井号(#)  
rgb 字符串值包含有效的rgb颜色  
rgba 字符串值包含有效的rgba颜色  
HSL 字符串值包含有效的hsl颜色  
hsla 字符串值包含有效的hsla颜色  
email 字符串值包含有效的电子邮件  
url 字符串值包含有效的网址,必须包含http://等  
uri 字符串值包含有效的uri. 它将接受golang请求uri接受的任何uri  
base64 字符串值包含有效的base64值  
contains 字符串值包含子字符串值, contains=@  
containsany 包含所有,containsany =!@#?  
containsrune 字符串值包含提供的符号 containsrune = @  
excludes 字符串值不包含子字符串值,excludes = @  
excludeall 排除所有  
excluderune 字符串值不包含提供的符号,excluderune = @  
isbn 国际标准书号,验证字符串值包含有效的isbn10或isbn13值  
isbn10 国际标准书号10, 验证字符串值包含有效的isbn10值  
isbn13 国际标准书号13, 字符串值包含有效的isbn13值  
uuid 字符串值包含有效的UUID  
uuid3 字符串值包含有效的版本3 UUID  
uuid4 字符串值包含有效的版本5 UUID  
uuid5 字符串值包含有效的版本5 UUID  
ascii 字符串值仅包含ASCII字符. 注意:如果字符串为空, 则验证为true  
asciiprint 字符串值仅包含可打印的ASCII字符. 注意: 如果字符串为空,则验证为true  
multibyte 字符串值包含一个或多个多字节字符。注意:如果字符串为空,则验证为true  
datauri 字符串值包含有效的DataURI。注意:这还将验证数据部分是有效的base64  
latitude 纬度,字符串值包含有效的纬度  
longitude 经度,字符串值包含有效的经度  
ssn 字符串值包含有效的美国社会安全号码  
ip 字符串值包含有效的IP地址  
ipv4 字符串值包含有效的v4 IP地址  
ipv6 字符串值包含有效的v6 IP地址  
cidr 字符串值包含有效的CIDR地址  
cidrv4 字符串值包含有效的CIDR地址  
cidrv6 字符串值包含有效的v6 CIDR地址  
tcp_addr 字符串值包含有效的可解析TCP地址  
dive 嵌套验证  
name [][]string  `binding:"gt=0,dive,len=1,dive,required"`
// gt = 0将应用于[]
// len = 1将应用于[] string
//必填项将应用于字符串

name [][]string  `binding:"gt=0,dive,dive,required"`
// gt = 0 将应用于[]
// []string 将保留验证
//必填项将应用于字符串

注意:gt、gte、lt、lte等都可以用于时间的比较,后面不需要跟值,直接binding:“gt”,表示大于当前utc时间

自定义验证器

3.1 安装:

go get github.com/go-playground/validator

3.2 定义验证器:

注意:必须为validator.Func类型

var Len6Valid validator.Func = func(fl validator.FieldLevel) bool {
    data := fl.Field().Interface().(string)
    if len(data) > 6 {
        fmt.Println("false")
        return false
    }else {
        fmt.Println("true")
        return true
    }
}

3.3 注册验证器:

在路由匹配前,main中即可

if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
   v.RegisterValidation("len_valid", valid.Len6Valid)
}

3.4 结构体中使用:

这里必须binding中,而且名称为前面注册的字符串名称

type Article struct {
    Id int `form:"id"`
    Title string `form:"title" binding:"required,len_valid"`
    Desc string `form:"desc" binding:"required,len_valid"`
}

4. beego中的验证器:

4.1 安装

go get github.com/astaxie/beego/validation

4.2 验证方法:

方法说明
Required 不为空,即各个类型要求不为其零值
Min(min int) 最小值,有效类型:int,其他类型都将不能通过验证
Max(max int) 最大值,有效类型:int,其他类型都将不能通过验证
Range(min, max int) 数值的范围,有效类型:int,他类型都将不能通过验证
MinSize(min int) 最小长度,有效类型:string slice,其他类型都将不能通过验证
MaxSize(max int) 最大长度,有效类型:string slice,其他类型都将不能通过验证
Length(length int) 指定长度,有效类型:string slice,其他类型都将不能通过验证
Alpha alpha字符,有效类型:string,其他类型都将不能通过验证
Numeric 数字,有效类型:string,其他类型都将不能通过验证
AlphaNumeric alpha 字符或数字,有效类型:string,其他类型都将不能通过验证
Match(pattern string) 正则匹配,有效类型:string,其他类型都将被转成字符串再匹配(fmt.Sprintf(“%v”, obj).Match)
AlphaDash alpha 字符或数字或横杠 -_,有效类型:string,其他类型都将不能通过验证
Email 邮箱格式,有效类型:string,其他类型都将不能通过验证
IP IP 格式,目前只支持 IPv4 格式验证,有效类型:string,其他类型都将不能通过验证
Base64 base64 编码,有效类型:string,其他类型都将不能通过验证
Mobile 手机号,有效类型:string,其他类型都将不能通过验证
Tel 固定电话号,有效类型:string,其他类型都将不能通过验证
Phone 手机号或固定电话号,有效类型:string,其他类型都将不能通过验证
ZipCode 邮政编码,有效类型:string,其他类型都将不能通过验证

4.3 通过 StructTag校验数据:

  • 验证函数写在 “valid” tag 的标签里
  • 各个验证规则之间用分号 “;” 分隔,分号后面可以有空格
  • 参数用括号 “()” 括起来,多个参数之间用逗号 “,” 分开,逗号后面可以有空格
  • 正则函数(Match)的匹配模式用两斜杠 “/” 括起来
  • 各个函数的结果的 key 值为字段名.验证函数名
type LoginParams struct {
      Name string valid:"Required"
      Age int    valid:"Required;MinSize(2)"
      Addr string    valid:"Required"
 }

func (l *LoginController) Post()  {
	valid := validation.Validation{}
	// 解析到结构体
    params := LoginParams{}
    if err := l.ParseForm(¶ms); err != nil {
        //handle error
        return
    }

      //重写错误信息:validation.SetDefaultMessage(map)
      var messages = map[string]string{
        "Required": "不能为空",
        "MinSize":  "最短长度为 %d",
        "Length":   "长度必须为 %d",
        "Numeric":  "必须是有效的数字",
        "Email":    "必须是有效的电子邮件地址",
        "Mobile":   "必须是有效的手机号码",
      }
      validation.SetDefaultMessage(messages)
      
      // 校验
      b, err := valid.Valid(¶ms)
      // 验证StructTag 是否正确
      if err != nil {
          fmt.Println(err)
      }
      if !b {   
          // 验证没通过,则b为false
          for _, err := range valid.Errors {
              fmt.Println(err.Key, err.Message)
              message := err.Key + err.Message
              l.Ctx.WriteString(message)
          }
      }
}