一、使用 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