validator进行参数校验、自定义校验规则、使用正则表达式

一、使用 github.com/go-playground/validator/v10 进行参数校验

  • 安装 validator:
go get "github.com/go-playground/validator/v10"
go get "github.com/go-playground/locales/zh"
go get "github.com/go-playground/universal-translator"

二、实现代码如下:

  • 创建一个validate实例:

    var validate = validator.New()
    
  • binds and validates data:

    // BindAndValid binds and validates data
    func BindAndValid(c *gin.Context, form interface{}) (int, int) {
    	err := c.Bind(form)
    	if err != nil {
    		fmt.Println(fmt.Sprintf("request %v parameter bind error=%v", c.Request.URL.Path, err))
    		return http.StatusBadRequest, 400
    	}
    
    	uni := ut.New(zh.New())
    	trans, _ := uni.GetTranslator("zh")
    	// 注册一个函数,获取struct tag里自定义的label作为字段名
    	validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
    		name := fld.Tag.Get("label")
    		return name
    	})
    
    	// 注册翻译器
    	err = zh_translations.RegisterDefaultTranslations(validate, trans)
    	if err != nil {
    		fmt.Println(err)
    	}
    	err = validate.Struct(form)
    	if err != nil {
    		for _, err := range err.(validator.ValidationErrors) {
    			fmt.Println(err.Translate(trans)) //年龄必须大于18
    			return http.StatusInternalServerError, 400
    		}
    	}
    
    	return http.StatusOK, 200
    }
    
  • 定义接口test,并且使用 BindAndValid :

    api_group := r.Group("/api/v1")
    api_group .POST("/test", func(c *gin.Context) {
    	var req ValidatorDemoRequest
    
    	// 校验入参: req
    	httpCode, errCode := BindAndValid(c, &req)
    	if errCode != 200 {
    		c.String(httpCode, fmt.Sprint(errCode,"入参校验失败"))
    		return
    	}
    
    	// 业务代码......
    	
    	c.String(200, "Hello, world!")
    })
    
  • struct 结构体配置如 ValidatorDemoRequest 所示,其中部分有注释讲解。
    注意事项:
    1、string 类型字段非必填时必须要在最前面加 “omitempty”。
    2、[]string 要加 “dive ”才会生效。
    3、有空格的字符串不能使用 “alpha”。
    4、[]map[string]string 类型需要使用两个 dive 才能控制 key 和 value 的校验规则。
    结构体配置参考: https://blog.csdn.net/arv002/article/details/120017072

四、自定义校验规则

func CompanyIdValidation(fl validator.FieldLevel) bool {
	verificationRole := `^[a-z0-9\-]*$`
	field := fl.Field()
	switch field.Kind() {
	case reflect.String:
		re, err := regexp.Compile(verificationRole)
		if err != nil {
			log.Println(err.Error())
			return false
		}
		return re.MatchString(field.String())
	default:
		return false
	}
}

// 不能存在 单引号、双引号、update、delete 等关键词
func GenericStringValidation(fl validator.FieldLevel) bool {
	verificationRole := `(?:")|(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|(\b(select|update|and|or|delete|insert|trancate|char|chr|into|substr|ascii|declare|exec|count|master|into|drop|execute)\b)`
	field := fl.Field()
	switch field.Kind() {
	case reflect.String:
		re, err := regexp.Compile(verificationRole)
		if err != nil {
			log.Println(err.Error())
			return false
		}
		return !re.MatchString(field.String())
	default:
		return false
	}
}
  • 注册自定义校验规则:

    var (
    	_                         = validate.RegisterValidation("companyIdValidation", CompanyIdValidation)
    	_                         = validate.RegisterValidation("gsv", GenericStringValidation)
    )
    

五、测试

  • 请求参数:

    {
        "user_id": "111",
        "company_id": "globalp111edi1111apc",
        "res_id": "globalpedia!pc11",
        "region_type": "INSE_A",
        "region_type1": "market",
        "app_ids": [
            "https://www.origin.com/hkg/en-us/store/apex/apex/addon/apex-legends--legacy-pack"
        ],
        "entity_type": "pc111",
        "regions": [],
        "regions1": [
            "ff",
            "ff"
        ],
        "url": "uer",
        "startDate": "2006-01",
        "endDate": "2000-01-02 15:04:05",
        "order": 22,
        "metric": [
            {
                "unified_id": "gsfdg",
                "metric_type": "11",
                "metrics": [
                    "uerhgfjh"
                ],
                "num": [
                    1
                ],
                "Array": [
                    "kbg"
                ]
            }
        ],
        "source": [
            "source1"
        ],
        "type": {
            "tabName": "fff"
        },
        "type1": [
            {
                "ff": "ed"
            }
        ],
        "page": 1,
        "pageSize": 1,
        "game_name": "``Åland Islands   2015 `` Luxury Slots - Free Casino Slots Game Run & Fly Superboy  ",
        "topic": "c'hr",
        "unified_id": "c'hr",
        "num": [
            1
        ],
        "Array": [
            "kbg"
        ]
    }
    
  • 使用postman调用接口:
    在这里插入图片描述

  • 报错信息如下:
    在这里插入图片描述

  • 参数修正后为:

    {
        "user_id": "111",
        "company_id": "globalp111",
        "res_id": "globalpedia!pc11",
        "region_type": "INSE_A",
        "region_type1": "market",
        "app_ids": [
            "https://www.origin.com/hkg/en-us/store/apex/apex/addon/apex-legends--legacy-pack"
        ],
        "entity_type": "pc",
        "regions": [],
        "regions1": [
            "ff",
            "ff"
        ],
        "url": "uer",
        "startDate": "2006-01",
        "endDate": "2000-01-02 15:04:05",
        "order": 22,
        "metric": [
            {
                "unified_id": "gsfdg",
                "metric_type": "11",
                "metrics": [
                    "uerhgfjh"
                ],
                "num": [
                    1
                ],
                "Array": [
                    "kbg"
                ]
            }
        ],
        "source": [
            "source1"
        ],
        "type": {
            "tabName": "fff"
        },
        "type1": [
            {
                "ff": "ed"
            }
        ],
        "page": 1,
        "pageSize": 1,
        "game_name": "``Åland Islands   2015 `` Luxury Slots - Free Casino Slots Game Run & Fly Superboy  ",
        "topic": "chrr",
        "unified_id": "chr",
        "num": [
            1
        ],
        "Array": [
            "kbg"
        ],
        "metrics": [
            "uerhgfjh"
        ]
    }
    
  • 接口请求成功:
    在这里插入图片描述

完整代码资源:https://download.csdn.net/download/qq_40227117/57044378

参考链接:https://pkg.go.dev/github.com/go-playground/validator/v10@v10.4.1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值