博客
关于我
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/

你可能感兴趣的文章
MSSQL日期格式转换函数(使用CONVERT)
查看>>
MSTP多生成树协议(第二课)
查看>>
MSTP是什么?有哪些专有名词?
查看>>
Mstsc 远程桌面链接 And 网络映射
查看>>
Myeclipse常用快捷键
查看>>
MyEclipse更改项目名web发布名字不改问题
查看>>
MyEclipse用(JDBC)连接SQL出现的问题~
查看>>
mt-datetime-picker type="date" 时间格式 bug
查看>>
myeclipse的新建severlet不见解决方法
查看>>
MyEclipse设置当前行背景颜色、选中单词前景色、背景色
查看>>
Mtab书签导航程序 LinkStore/getIcon SQL注入漏洞复现
查看>>
myeclipse配置springmvc教程
查看>>
MyEclipse配置SVN
查看>>
MTCNN 人脸检测
查看>>
MyEcplise中SpringBoot怎样定制启动banner?
查看>>
MyPython
查看>>
MTD技术介绍
查看>>
MySQL
查看>>
MySQL
查看>>
mysql
查看>>