首页 > 作文

Gin框架 – 数据绑定和验证

更新时间:2023-04-07 21:23:25 阅读: 评论:0

概述

上篇文章分享了 gin 框架使用 logrus 进行日志记录,这篇文章分享 gin 框架的数据绑定与验证。

有读者咨询我一个问题,如何让框架的运行日志不输出控制台?

解决方案:

engine := gin.default() //修改成如下        engine := gin.new() 

我是怎么知道的?看框架代码。

default():  有创意搞笑的队名  func default() *engine {            debugprintwarningdefault()            engine := new()            engine.u(logger(), recovery())            return engine        }

new() 代码我就不贴了。

我们看到 default() 使用了两个中间件 logger(),recovery(),如果不想使用,那就直接使用 new() 就可以了。

开始今天的文章。

比如,请求 v1/member/add 新增会员方法, name、 age 为必填,同时 name 不能等于 admin 字符串,10 <= age <= 120。

直接看代码吧。

首先,先定义一个结构体。

entity/member.go    package entity        // 定义 member 结构体        type member struct {            name string `form:"name" json:"name" binding:"required,namevalid"`            age  int    `form:"age"  json:"age"  binding:"required,gt=10,lt=120"`        }

binding 中 required,这个是框架自带的, 广告艺术namevalid,这个是自己定义的。

问题一:框架自带的 binding 参数还有哪些?

问题二:自定义验证方法,怎么写?

接下来要说的就是问题二,写一个验证方法。

validator/member/member.go    package member        import (            "gopkg.in/go-playground/validator.v8"            "reflect"        )        func namevalid(            v *validator.validate, topstruct reflect.value, currentstructorfield reflect.value,            field reflect.value, fieldtype reflect.type, fieldkind reflect.kind, param string,        ) bool {            if s, ok := field.interface().(string); ok {                if s == "admin" {                    return fal                }            }            return true        }

接下来,在路由中绑定:

router/router.go    package router        import (            "gindemo/middleware/logger"            "gindemo/middleware/sign"            "gindemo/router/v1"            "gindemo/router/v2"            "gindemo/validator/member"            "github.com/gin-gonic/gin"            "github.com/gin-gonic/gin/binding"            "gopkg.in/go-playground/validator.v8"        )        func initrouter(r *gin.engine)  {            r.u(logger.loggertofile())            // v1 版本            groupv1 := r.group("/v1")            {                groupv1.any("/product/add", v1.addproduct)                groupv1.any("/member/add", v1.addmember)            }            // v2 版本            groupv2 := r.group("/v2").u(sign.sign())            {                groupv2.any("/product/add", v2.addproduct)                groupv2.any("/member/add", v2.addme医药渠道mber)            }            // 绑定验证器            if v, ok := binding.validator.engine().(*validator.validate); ok {                v.registervalidation("namevalid", member.namevalid)            }        }

最后,看一下调用的代码。

router/v1/member.go    package v1        import (            "gindemo/entity"            "github.com/gin-gonic/gin"            "net/http"        )        func addmember(c *gin.context) {            res := entity.result{}            mem := entity.member{}            if err := c.shouldbind(&mem); err != nil {                res.tcode(entity.code_error)                res.tmessage(err.error())                c.json(http.statusforbidden, res)                c.abort()                return            }            // 处理业务(下次再分享)            data := map[string]interface{}{                "name" : mem.name,                "age"  : mem.age,            }            res.tcode(entity.code_error)            res.tdata(data)            c.json(http.statusok, res)        }

访问看看效果吧。

访问:http://localhost:8080/v1/member/add    {            "code": -1,            "msg": "key: 'member.name' error:field validation for 'name' failed on the 'required' tag\nkey: 'member.age' error:field validation for 'age' failed on the 'required' tag",            "data": null        }访问:http://localhost:8080/v1/member/add?name=1    {            "code": -1,            "msg": "key: 'member.age' error:field validation for 'age' failed on the 'required' tag",            "data": null        }访问:http://localhost:8080/v1/member/add?age=1    {            "code": -1,            "msg": "key: 'member.age' error:field validation for 'age' failed on the 'required' tag",            "data": null        }访问:http://localhost:8080/v1/member/add?name=admin&age=1    {            "code": -1,            "msg": "key: 'member.name' error:field validation for 'name' failed on the 'namevalid' tag",            "data": null        }访问:http://localhost:8080/v1/member/add?name=1&age=1    {            "code": -1,            "msg": "key: 'member.age' error:field validation for 'age' failed on the 'gt' tag",            "data": null        }访问:http://localhost:8080/v1/member/add?name=1&age=121    {            "code": -1,            "msg": "key: 'member.age' error:field validation for 'age' failed on the 'lt' tag",            "data": null       发放 }访问:http://localhost:8080/v1/member/add?name=tom&age=30    {            "code": 1,            "msg": "",            "data": {                "age": 30,                "name": "tom"            }    }


为避免返回信息过多,错误提示咱们也可以统一。

if err := c.shouldbind(&mem); err != nil {            res.tcode(entity.code_error)            res.tmessage("参数验证错误")            c.json(http.statusforbidden, res)            c.abort()            海南健康管理职业技术学院return        }

这一次目录结构调整了一些,在这里说一下:

├─ gindemo
│ ├─ common //公共方法
│ ├── common.go
│ ├─ config //配置文件
│ ├── config.go
│ ├─ entity //实体
│ ├── …
│ ├─ middleware //中间件
│ ├── logger
│ ├── …
│ ├── sign
│ ├── …
│ ├─ router //路由
│ ├── …
│ ├─ validator //验证器
│ ├── …
│ ├─ vendor //扩展包
│ ├── github.com
│ ├── …
│ ├── golang.org
│ ├── …
│ ├── gopkg.in
│ ├── …
│ ├─ gopkg.toml
│ ├─ gopkg.lock
│ ├─ main.go

将 sign 和 logger 调整为中间件,并放到 middleware 中间件 目录。

新增了 common 公共方法目录。

新增了 validator 验证器目录。

新增了 entity 实体目录。

具体代码我会放到 github,有感兴趣的可以去看:https://github.com/xinliangnote/go。

上面还遗漏了 问题一 没解决,框架自带的 binding 参数还有哪些?

本文发布于:2023-04-07 21:22:54,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/66db5099583fc769bb78319ddc5dd5ba.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Gin框架 – 数据绑定和验证.doc

本文 PDF 下载地址:Gin框架 – 数据绑定和验证.pdf

标签:框架   代码   目录   方法
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图