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

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

为什么要数据校验

数据校验是一种在软件开发中常用的技术手段,类似于中间件的作用。它的主要目的是确保前端传递过来的数据在到达控制器前已经经过了初步的合法性检查,从而减少数据在控制层中的校验工作。手动在控制器中一个一个校验数据,不仅效率低下,还容易导致代码冗长、难以维护。

在Go语言中,由于缺乏像Java那样通过注解直接对数据进行校验的方式,开发者通常会利用结构体中的校验方法来实现数据验证。这虽然在某些程度上增加了代码复杂性,但对于Go语言的特性来说,这是比较常见的处理方式。

Go语言中的数据校验工具

Go语言中有一个非常强大的开源库——[github.com/go-playground/validator](https://github.com/go-playground/validator),可以用来简化数据校验流程。以下是使用该工具的基本步骤:
  • 安装依赖包

    首先需要通过终端安装依赖包:

    go get github.com/go-playground/validator
  • 使用文档

    该工具的使用文档非常详细,开发者可以参考其官方网站或相关文档来快速上手。

  • 自定义校验器

    Go语言的数据校验工具允许开发者自定义校验规则,从而根据具体需求对数据进行更细致的验证。以下是使用自定义校验器的示例:
  • 定义校验规则

    首先需要定义一个包含自定义校验的结构体:

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

    开发者可以编写自定义的校验方法并注册到Validator中:

    func checkNameFunc(f validator.FieldLevel) bool {      if f.Field().String() == "" {          return false      }      return true  }  var validate *validator.Validate  func init() {      validate = validator.New()      validate.RegisterValidation("checkName", checkNameFunc)  }
  • 使用校验器

    在需要校验数据的部分,使用Validator进行结构体验证:

    func main() {      router := gin.Default()      router.POST("/register", func(c *gin.Context) {          var user UserInfo          if err := c.Bind(&user); err != nil {              c.JSON(http.StatusOK, gin.H{                  "code":    1,                  "message": "请求参数错误",              })              return          }          err = validate.Struct(user)          if err != nil {              for _, e := range err.(validator.ValidationErrors) {                  fmt.Printf("错误字段: %s\n错误值: %s\n错误tag: %s\n",                          e.Field(), e.Value(), e.Tag())              }              c.JSON(http.StatusOK, gin.H{                  "code":    1,                  "message": "数据校验错误",              })              return          }          fmt.Printf("接收到的数据: %v\n", user)          c.JSON(http.StatusOK, gin.H{              "code":    0,              "message": "请求成功",          })      })      router.Run(":8000")  }
  • 多层嵌套数据的校验

    在实际项目中,数据往往会有多层嵌套的结构。Go语言的Validator支持通过`dive`功能对嵌套结构体进行校验,这大大简化了数据校验的逻辑。以下是使用`dive`功能的示例:
  • 定义嵌套结构体

    假设需要校验用户的收货地址:

    type Address struct {      Province string `validate:"required" json:"province"`      City     string `validate:"required" json:"city"`      County   string `validate:"required" json:"county"`      Mobile   string `validate:"numeric,len=11" json:"mobile"`  }  type UserInfo struct {      Id        string `validate:"uuid" json:"id"`      Name      string `validate:"checkName,required" json:"name"`      Age       uint8  `validate:"min=0,max=130,required" json:"age"`      Address   []Address `validate:"dive" json:"address"`  }
  • 使用postman提交测试数据

    通过postman工具提交以下数据:

    {      "name": "admin",      "age": 20,      "id": "3f7a783f-f9dc-4db8-9c6b-afe1d3f9b3f7",      "address": [          {              "province": "广东省",              "city": "深圳市",              "county": "宝安区",              "mobile": "18112345678"          }      ]  }
  • 通过上述方法,可以轻松实现多层嵌套数据的校验,进一步提升数据处理的安全性和准确性。

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

    你可能感兴趣的文章
    PHP应用程序连接MSQL数据库Demo(附crud程序)
    查看>>
    PHP应用程序连接Oracle数据库Demo(附Oracle客户端安装文件)
    查看>>
    PHP开发api接口安全验证
    查看>>
    PHP开发规范PSR
    查看>>
    PHP开发遇到错误0001
    查看>>
    rabbitmq guestguest用户不能远程登录
    查看>>
    php异常处理
    查看>>
    PHP引入了泛型和集合两大重要特性,大大改善 PHP 代码的可维护性和可读性
    查看>>
    PHP引擎php.ini参数优化
    查看>>
    PHP引用(&)使用详解
    查看>>
    php引用及垃圾回收
    查看>>
    php当前时间的集中写法
    查看>>
    php循环比较数组中的值,如何从PHP数组中计算值并在foreach循环中仅显示一次值?...
    查看>>
    php微信 开发笔记,微信WebApp开发总结笔记
    查看>>
    php微信公众号开发access_token获取
    查看>>
    php微信公众号开发微信认证开发者
    查看>>
    php微信公众号开发用户基本信息
    查看>>
    php怎么将对象变成数组,php怎么将对象转换成数组
    查看>>
    RabbitMQ - 消息堆积问题的最佳解决方案?惰性队列
    查看>>
    php怎样比较两数大小,jquery如何判断两个数值的大小
    查看>>