咔叽游戏

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 694|回复: 0

[Golang] golan参数校验Validator

[复制链接]
  • TA的每日心情
    无聊
    2019-4-21 13:02
  • 签到天数: 3 天

    [LV.2]圆转纯熟

    发表于 2022-1-10 11:14:07 | 显示全部楼层 |阅读模式
    目录

      1.实践
        1.1校验标签
        1.2字符串约束
        1.3自定义校验器


    前言:
    开发接口的时候需要多前端提交的参数进行参数校验,如果提交的参数只有一个两个,这样我们可以简单写个if判断,但是如果提交的参数比较多,通过if判断就比较繁琐了,在Go中有一个validator包可以通过反射结构体struct的tag进行参数校验

    1.实践

    1. go get github.com/go-playground/validator/v10
    复制代码
    定义结体:
    1. type UserInfo struct {
    2. ID    int `validate:"gt=0"`
    3. Age   int `validate:"gt=0"`
    4. Name  string `validate:"required"`
    5. Sex   string `validate:"required"`
    6. }
    复制代码
    初始化结构体并做参数校验:
    1. func InitUserInfo(id,age int,name,sex string) *UserInfo {
    2. // new一个校验器
    3. valid := validator.New()
    4. // 初始化UserInfo
    5. userInfo := &UserInfo{
    6.   ID: id,
    7.   Age: age,
    8.   Name:name,
    9.   Sex:sex,
    10. }
    11. if err := valid.Struct(userInfo);err != nil {
    12.   fmt.Println("参数校验不通过",err)
    13. }
    14. return userInfo
    15. }
    复制代码
    效果:
    1. InitUserInfo(1,2,"kevin","男")// 参数校验通过
    2. InitUserInfo(0,2,"kevin","男")// 参数校验不通过 Key: 'UserInfo.ID' Error:Field validation for 'ID' failed on the 'gt' tag
    3. InitUserInfo(1,2,"kevin","")// 参数校验不通过 Key: 'UserInfo.Sex' Error:Field validation for 'Sex' failed on the 'required' tag
    复制代码
    如参数校验不通过,err中会包含不通过字段信息

    1.1校验标签


    -:跳过该字段,不测验;
    |:应用多个束缚,只须要满足其中一个,例如rgb|rgba;
    required:字段必须设置,不能为默认值;
    omitempty:如果字段未设置,则疏忽它
    golan参数校验Validator-1.png

    golan参数校验Validator-2.png


    1.2字符串约束


      excludesall:不包含参数中任意的 UNICODE 字符,例如excludesall=ab;excludesrune:不包含参数表示的 rune 字符,excludesrune=asong ;startswith:以参数子串为前缀,例如startswith=hi;endswith:以参数子串为后缀,例如endswith=bye 。contains= :包含参数子串,例如contains=email;containsany:包含参数中任意的 UNICODE 字符,例如containsany=ab;containsrune:包含参数表示的 rune 字符,例如`containsrune=asong;excludes:不包含参数子串,例如excludes=email;

    1.3自定义校验器


    在Gin中支持实现自定义校验标签
    定义校验逻辑:
    1. // sum不能大于10
    2. func VerifySum(level validator.FieldLevel) bool {
    3. if sum,ok := level.Field().Interface().(int);ok{
    4.   fmt.Println(sum)
    5.   if sum > 10 {
    6.    return false
    7.   }
    8.   return true
    9. }
    10. return false
    11. }
    复制代码
    注册标签:
    1. // 注册
    2. if v,ok := binding.Validator.Engine().(*validator.Validate); ok {
    3.   if err := v.RegisterValidation("sum",VerifySum);err != nil{
    4.    fmt.Println("参数校验标签注册失败")
    5.   }
    6.   fmt.Println("参数校验标签注册成功")
    7. }
    复制代码
    应用标签到结构体上:
    1. type TestSum struct {
    2. Sum int `binding:"sum"`
    3. }
    复制代码
    测试:
    1. func getSum(c *gin.Context) {
    2. var b TestSum
    3. b.Sum = cast.ToInt(c.Request.URL.Query().Get("sum"))
    4. // 数据模型绑定查询字符串验证
    5. if err := c.ShouldBindWith(&b, binding.Query); err == nil {
    6.   c.JSON(http.StatusOK, gin.H{"message": "prams are valid!"})
    7. } else {
    8.   c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    9. }
    10. }
    11. func main()  {
    12. route := gin.Default()
    13. // 注册
    14. if v,ok := binding.Validator.Engine().(*validator.Validate); ok {
    15.   if err := v.RegisterValidation("sum",VerifySum);err != nil{
    16.    fmt.Println("参数校验标签注册失败")
    17.   }
    18.   fmt.Println("参数校验标签注册成功")
    19. }
    20. route.GET("/getSum", getSum)
    21. route.Run(":8080")
    22. }
    复制代码
    golan参数校验Validator-3.png

    golan参数校验Validator-4.png

    附加:
    Go中获取标签值是通过反射进行获取的:
    1.   type TestSum struct {
    2.     Sum int `binding:"sum"`
    3.   }
    4.   // 获取标签值:
    5. var b TestSum
    6. b_type := reflect.TypeOf(b)
    7. fmt.Println(b_type.Field(0).Tag.Get("binding"))
    复制代码
    到此这篇关于golan参数校验Validator的文章就介绍到这了,更多相关go参数校验Validator内容请搜索咔叽论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持咔叽论坛!

    原文地址:https://www.jb51.net/article/232352.htm

    QQ|免责声明|小黑屋|手机版|Archiver|咔叽游戏

    GMT+8, 2023-12-11 10:04

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表