> 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 的值
- 基础知识
- 开发环境
- 包名规则
- 包初始化 (init)
- 基础数据类型
- 基础类型转换
- 格式化输出
- go指针
- 流程控制语句
- 函数定义
- 匿名函数
- 数组和切片
- map集合
- 结构体
- Interface接口
- 日期处理
- 数学计算
- 正则表达式
- 协程 (并发处理)
- channel
- waitgroup
- mutex (锁机制)
- websocket
- protobuf
- Redis
- 错误处理
- 打包程序
- NSQ消息队列
- 单元测试
- beego
- 安装入门
- Gin
- 快速入门
- 路由与控制器
- 处理请求参数
- 表单验证
- 处理响应结果
- 渲染HTML模版
- 访问静态文件
- Gin中间件
- Cookie处理
- Session处理
- Gin上传文件
- swagger
- pprof性能测试
- GORM
- 入门教程
- 模型定义
- 数据库连接
- 插入数据
- 查询数据
- 更新数据
- 删除数据
- 事务处理
- 关联查询
- 属于 (BELONG TO)
- 一对一 (Has One)
- 一对多 (Has Many)
- 多对多 (Many to Many)
- 预加载 (Preloading)
- 错误处理
- 第三方常用插件
- viper 读取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷键