多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> web中经常会用到参数绑定以及表单自动验证功能,可以节约大量的重复劳动以及提高可维护性 [TOC] ## 示例代码 ~~~ package main import ( "net/http" "time" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/go-playground/validator/v10" ) // User 中包含了绑定的表单请求字段和验证规则 type User struct { Username string `form:"username" binding:"required,NameValid"` Password string `form:"password" binding:"required,gt=5,lt=10"` } // 自定义验证器 var NameValid validator.Func = func(fl validator.FieldLevel) bool { s, ok := fl.Field().Interface().(string) if ok { if s == "admin" { return false } } return true } func TestValidate(c *gin.Context) { var user User if err := c.ShouldBindWith(&user, binding.Query); err == nil { c.JSON(http.StatusOK, gin.H{"message": "通过校验!", "username": user.Username}) } else { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } } func main() { route := gin.Default() // 注册新的自定义验证规则 if v, ok := binding.Validator.Engine().(*validator.Validate); ok { if err := v.RegisterValidation("NameValid", NameValid); err != nil { panic("-----> validate[NameValid] binding failed") } } // 访问地址:http://localhost:8080/TestValidate?username=admin&password=123 route.GET("/TestValidate", TestValidate) route.Run(":8080") } ~~~ > 访问 http://localhost:8080/TestValidate?username=admin&password=123 进行测试 ## 验证规则 > 更多binding标签参考:https://godoc.org/github.com/go-playground/validator 标签 | 说明 ---|--- required| 必填 email| 验证字符串是email格式;例:"email" url| 这将验证字符串值包含有效的网址;例:"url" max| 字符串最大长度;例:"max=20" min| 字符串最小长度;例:"min=6" excludesall| 不能包含特殊字符;例:"excludesall=0x2C"//注意这里用十六进制表示 len| 字符长度必须等于n,或者数组、切片、map的len值为n,即包含的项目数;例:"len=6" eq| 数字等于n,或者或者数组、切片、map的len值为n,即包含的项目数;例:"eq=6" ne | 数字不等于n,或者或者数组、切片、map的len值不等于为n,即包含的项目数不为n,其和eq相反;例:"ne=6" gt| 数字大于n,或者或者数组、切片、map的len值大于n,即包含的项目数大于n;例:"gt=6" gte| 数字大于或等于n,或者或者数组、切片、map的len值大于或等于n,即包含的项目数大于或等于n;例:"gte=6" lt| 数字小于n,或者或者数组、切片、map的len值小于n,即包含的项目数小于n;例:"lt=6" lte|数字小于或等于n,或者或者数组、切片、map的len值小于或等于n,即包含的项目数小于或等于n;例:"lte=6" ## 跨字段验证 标签 | 说明 ---|--- eqfield=Field|必须等于 Field 的值 nefield=Field| 必须不等于 Field 的值 gtfield=Field| 必须大于 Field 的值 gtefield=Field| 必须大于等于 Field 的值 ltfield=Field| 必须小于 Field 的值 ltefield=Field| 必须小于等于 Field 的值 eqcsfield=Other.Field|必须等于 struct Other 中 Field 的值 necsfield=Other.Field|必须不等于 struct Other 中 Field 的值 gtcsfield=Other.Field |必须大于 struct Other 中 Field 的值 gtecsfield=Other.Field| 必须大于等于 struct Other 中 Field 的值 ltcsfield=Other.Field| 必须小于 struct Other 中 Field 的值 ltecsfield=Other.Field| 必须小于等于 struct Other 中 Field 的值