博客
关于我
gin框架中对前端传递的数据进行校验
阅读量:119 次
发布时间:2019-02-26

本文共 2534 字,大约阅读时间需要 8 分钟。

一、为什么要数据校验

  • 数据校验有点类似中间件的作用,使前端传递过来的数据更加合法的到达控制器,以减少数据在控制层中一个一个的校验。
  • 如果不使用数据校验,要不就自己手动的在控制器中一个一个的数据校验
  • go语言中是没有类似java一样的注解的方式来校验数据,但是可以在结构体中使用校验方法来校验(本人不是特别的喜欢这种方式,但是对于这门语言也只能这样)

二、在go语言中使用数据校验

  • 1、官网地址

    https://github.com/go-playground/validator
  • 2、安装依赖包

    go get github.com/go-playground/validator
  • 3、基础的使用参考官网

三、自定义校验器

  • 1、定义接收参数的结构体

    type UserInfo struct {     	Id   string `validate:"uuid" json:"id"`           //UUID 类型	Name string `validate:"checkName,required" json:"name"`     // 自定义校验	Age  uint8  `validate:"min=0,max=130,required" json:"age"` // 年龄}
  • 2、自定义方法

    func checkNameFunc(f validator.FieldLevel) bool {     	count := utf8.RuneCountInString(f.Field().String())	if count >= 2 && count <= 12 {     		return true	} else {     		return false	}}
  • 3、在init函数中注册方法

    var valildate *validator.Validatefunc init() {     	valildate = validator.New()	valildate.RegisterValidation("checkName", checkNameFunc)}
  • 4、在main函数中使用

    func main() {     	router := gin.Default()	router.POST("/register", func(c *gin.Context) {     		user := UserInfo{     }		//或者var user = UserInfo		err := c.Bind(&user)		if err != nil {     			c.JSON(http.StatusOK, gin.H{     				"code":    1,				"message": "请求参数错误",			})			return		}		err = valildate.Struct(user)		if err != nil {     			// 输出校验错误 .(validator.ValidationErrors)是断言			for _, e := range err.(validator.ValidationErrors) {     				fmt.Println("错误字段:", e.Field())				fmt.Println("错误的值:", e.Value())				fmt.Println("错误的tag:", e.Tag())			}			c.JSON(http.StatusOK, gin.H{     				"code":    1,				"message": "数据校验错误",			})			return		}		fmt.Println(user, "接收的数据")		c.JSON(http.StatusOK, gin.H{     			"code":    0,			"message": "请求成功",		})	})	router.Run(":8000")}

四、对于多层嵌套数据的校验

  • 1、对于多层结构体的数据校验使用dive

  • 2、入参的结构体

    type UserInfo struct {     	Id   string `validate:"uuid" json:"id"`           //UUID 类型	Name string `validate:"checkName,required" json:"name"`     // 自定义校验	Age  uint8  `validate:"min=0,max=130,required" json:"age"` // 年龄	Address []Address `validate:"dive" json:"address"` // 收货地址}type Address struct {     	Province string `json:"province" validate:"required"` // 省份	City string `json:"city" validate:"required"` // 市	County string `json:"county" validate:"required"` //县	Mobile string `json:"mobile" validate:"numeric,len=11"` // 手机号码}
  • 3、使用postman提交数据

    {    "name": "admin",    "age": 20,    "id": "3f7a783f-f9dc-4db8-9c6b-afe1d3f9b3f7",    "address": [        {            "province": "广东省",            "city":"深圳市",            "county": "宝安区",            "mobile": "18112345678"        }    ]}
  • 4、别的和上面一样的结构

转载地址:http://tnvf.baihongyu.com/

你可能感兴趣的文章
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>
mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
查看>>
MYSQL:基础——3N范式的表结构设计
查看>>
MYSQL:基础——触发器
查看>>
Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
查看>>
mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
查看>>
mysqldump 参数--lock-tables浅析
查看>>