专栏首页大话swiftgin框架之表单验证

gin框架之表单验证

实践经验告诉我们,前端提交过来的一切数据都可以信任,都必须做校验。所以我们必须要进行数据校验!那么在gin框架中怎么做校验的呢!gin默认使用的是validator库,有兴趣的小伙伴可以去自己看一下文档,github地址是:
  1. https://github.com/go-playground/validator

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

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

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

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()
 

访问地址

  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

本文分享自微信公众号 - 大话swift(gh_ca2266b7cab0),作者:寒云

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Kotlin的流程控制

    上栗1的结果为true,2的结果为false,因为1是将内部数据排序然后比较数据,而2则是因为两个地址不同直接判断为false。我们再看下里

    大话swift
  • protocol buffer基本科普

    pb有一套自己的语法定义数据格式,根据特性的语法形式定义数据,个人可以根据需要自定义DSL进行格式转换各个平台的语言代码,当然了这样的工作量是巨大的,G...

    大话swift
  • 五彩斑斓的黑

    Apple的黑暗模式已经横空出世很久国内蓝绿大厂也已经迎头赶上,大家已经吃到macOS下五彩斑斓的黑然鹅很多App依然没有适配出五彩斑斓的黑。比如楼主自己的Ma...

    大话swift
  • 个性化推荐系统设计(3.1)如何评价个性化推荐系统的效果

       一般来说,Precision就是检索出来的条目(比如:文档、网页等)有多少是准确的,Recall就是所有准确的条目有多少被检索出来了。   正确率、召回...

    两只橙
  • 程序员面试金典 - 面试题 01.03. URL化(字符串)

    URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使...

    Michael阿明
  • 解决Windows10下80端口被PID为4的System占用的问题

      最近由于好奇心,更新了windows10系统,感觉上手还蛮快,而且体验还不错,但是在IDEA中做开发时,使用80端口进行启动项目的时候发现端口被占用了,于是...

    阿豪聊干货
  • salesforce 零基础开发入门学习(十)IDE便捷小知识

    在这里介绍两个IDE的便捷开发的小知识。 一) 本地调试 由于salesforce代码只能提交以后才能调试,所以很多时候调试代码很麻烦。新版增加了一个特性:即可...

    用户1169343
  • 物联网开发:IT-OT争端的解决之道

    开发者们将物联网技术应用工业或企业环境中面临着一个挑战:物联网设备的安装和流程的监测通常是运营技术(OT)的一部分,他们负责使机器运行和流程更高效、更高产。但运...

    CSDN技术头条
  • UVA 11624 Fire!(双点bfs)

           这道题就是问一个人能否逃出地图,当然不是那种简单的走地图,还有一堆火(划重点)。说下思路,这道题坑点还是比较多的,首先火源不只一处,可以有多处,那...

    Ch_Zaqdt
  • ASPNET_WEBAPI快速学习02

    这部分内容的学习,已经放了大半年时间了,果断补充上,尽早将过去遗留的老技术坑都补上。首先将介绍服务幂等性的概念和相关解决方案,这部分也将是本文的理解难点,由于W...

    用户1216676

扫码关注云+社区

领取腾讯云代金券