https://github.com/go-playground/validator
gin框架为我们整合和一些基础的模型绑定和数据校验,比如:
但是,有的时候我们需要自己定义校验规则,我们就需要紫荆定义校验方法
func mobile(fl validator.FieldLevel) bool {
ok, _ := regexp.MatchString(`^1[3-9][0-9]{9}$`, fl.Field().String())
return ok
}
然后注册进来
v.validate.RegisterTagNameFunc(func(field reflect.StructField) string {
return field.Tag.Get("json")
})
_ = v.validate.RegisterValidation("mobile", mobile)
我尝试了github上提供的国际化方案,觉得不是很理想,自定义了错误翻译方法
//翻译错误信息
func TranslateOverride(err error, msgMap map[string]string) map[string]string {
var errMap = map[string]string{}
if err != nil {
errs := err.(validator.ValidationErrors)
for _, e := range errs {
// can translate each error one at a time.
key := fmt.Sprintf("%v.%v", e.Field(), e.Tag())
if _, ok := msgMap[key]; ok {
if e.Param() != "" {
errMap[key] = strings.Replace(msgMap[key], "{"+e.Tag()+"}", e.Param(), -1)
} else {
errMap[key] = msgMap[key]
}
} else {
errMap[key] = key + "未定义翻译字段"
}
}
}
return errMap
}
自定义错误信息
var (
MsgMap = map[string]string{}
)
func init() {
MsgMap["Name.required"] = "用户名不可以为空"
MsgMap["Name.min"] = "用户名长度大于{min}位"
MsgMap["Name.max"] = "用户名长度小于{max}位"
MsgMap["Password.required"] = "密码不可以为空"
MsgMap["Password.min"] = "密码长度大于{min}位"
MsgMap["Password.max"] = "密码长度小于{max}位"
MsgMap["Age.gt"] = "年龄必须大于{gt}"
MsgMap["Mobile.required"] = "手机号不可以为空"
MsgMap["Mobile.mobile"] = "手机号格式不符合要求"
}
执行
binding.Validator = new(defaultValidator)
router := gin.Default()
router.GET("/", func(context *gin.Context) {
var user User
if err := context.ShouldBindQuery(&user); err == nil {
fmt.Println(user)
} else {
e := TranslateOverride(err, MsgMap)
fmt.Println(e)
}
})
router.Run()
访问地址
http://127.0.0.1:8080/?name=111&mobile=157013088
控制台输出自定义翻译信息
map[Age.gt:年龄必须大于4
Mobile.mobile:手机号格式不符合要求
Name.min:用户名长度大于4位
Password.required:密码不可以为空]
需要国际化的小伙伴可自己尝试着修改一下
链接:https://pan.baidu.com/share/init?surl=0XaLqgwUOV_Lk366FwpRwA 提取码:j5yp