前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gin框架之表单验证

gin框架之表单验证

作者头像
大话swift
发布2020-03-27 16:20:40
2.1K0
发布2020-03-27 16:20:40
举报
文章被收录于专栏:大话swift
实践经验告诉我们,前端提交过来的一切数据都可以信任,都必须做校验。所以我们必须要进行数据校验!那么在gin框架中怎么做校验的呢!gin默认使用的是validator库,有兴趣的小伙伴可以去自己看一下文档,github地址是:
  1. https://github.com/go-playground/validator

gin框架为我们整合和一些基础的模型绑定和数据校验,比如:

  • ShouldBind
  • ShouldBindQuery
  • ShouldBindUri
  • ShouldBindJSON
  • ShouldBindHeader
  • ShouldBindYAML
  • 等等

但是,有的时候我们需要自己定义校验规则,我们就需要紫荆定义校验方法

代码语言:javascript
复制
func mobile(fl validator.FieldLevel) bool {
 
    ok, _ := regexp.MatchString(`^1[3-9][0-9]{9}$`, fl.Field().String())
 
 return ok
 
}
 

然后注册进来

代码语言:javascript
复制
        v.validate.RegisterTagNameFunc(func(field reflect.StructField) string {
 
 return field.Tag.Get("json")
 
 })
 
        _ = v.validate.RegisterValidation("mobile", mobile)
 

我尝试了github上提供的国际化方案,觉得不是很理想,自定义了错误翻译方法

代码语言:javascript
复制
//翻译错误信息
 
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
 
}
 

自定义错误信息

代码语言:javascript
复制
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"] = "手机号格式不符合要求"
 


 
}
 

执行

代码语言:javascript
复制
    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()
 

访问地址

  1. http://127.0.0.1:8080/?name=111&mobile=157013088

控制台输出自定义翻译信息

  1. map[Age.gt:年龄必须大于4 Mobile.mobile:手机号格式不符合要求 Name.min:用户名长度大于4位 Password.required:密码不可以为空]

需要国际化的小伙伴可自己尝试着修改一下

链接:https://pan.baidu.com/share/init?surl=0XaLqgwUOV_Lk366FwpRwA 提取码:j5yp

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档