内容概述
本文主要记录了bind参数绑定和验证的一些常用方法,以及中间件的一些知识。重在入门,Gin还提供了很多强大的方法,远远不止这些。
主要内容
bind参数绑定
gin中的bind可以很方便的将 前端传递 来的数据与 结构体 进行 参数绑定 ,以及参数校验。Gin提供了两类绑定方法,分别是Must bind 和 Should bind。Must bind如果发生绑定错误,则请求终止,并触发响应状态码修改,不常用。而Should bind如果发生绑定错误,会返回错误并由开发者处理错误和请求。下面介绍几种常用的bind方法。最常用的就是ShouldBindXXX方法,XXX可以是JSON,XML,TOML,YAML。以JSON为例
package main
import "github.com/gin-gonic/gin"
type UserInfo struct {
Age int `json:"age"`
}
func main() {
router := gin.Default()
router.POST("/", func(c *gin.Context) {
var userInfo UserInfo
err := c.ShouldBindJSON(&userInfo)
if err != nil {
c.JSON(200, gin.H{"msg": "错误"})
return
}
c.JSON(200, userInfo)
})
router.Run(":80")
}
binding验证
在结构体后面填写binding字段,常用验证器有
- required: 必填字段,如:binding:"required"
- 针对字符串的长度
- min 最小长度,如:binding:"min=5"
- max 最大长度,如:binding:"max=10"
- len 长度,如:binding:"len=6"
- 针对数字的大小
- eq 等于,如:binding:"eq=3"
- ne 不等于,如:binding:"ne=12"
- gt 大于,如:binding:"gt=10"
- gte 大于等于,如:binding:"gte=10"
- lt 小于,如:binding:"lt=10"
- lte 小于等于,如:binding:"lte=10"
- 针对同级字段的
- eqfield 等于其他字段的值,如:PassWord string
binding:"eqfield=Password" - nefield 不等于其他字段的值
- 忽略字段,如:binding:"-"binding:"len=6";
当验证不通过时,会给出错误的信息,但是原始的错误信息不太友好,不利于用户查看 只需要给结构体加一个msg 的tag,具体用法如下:
type UserInfo struct {
Username string `json:"username" binding:"required" msg:"用户名不能为空"`
Password string `json:"password" binding:"min=3,max=6" msg:"密码长度不能小于3大于6"`
Email string `json:"email" binding:"email" msg:"邮箱地址格式不正确"`
}
中间件
Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。设置好中间件以后,中间件后面的路由都会使用这个中间件;设置在中间件之前的路由则不会生效。Gin中的中间件必须是一个gin.HandlerFunc类型。
定义中间件有两种方法,func Test(c *gin.Context) { }和func Test() gin.HandlerFunc { }
注册多个中间件使用方法router.GET,后面可以跟很多HandlerFunc方法,这些方法其实都可以叫中间件
使用Abort()拦截,后续的HandlerFunc就不会执行了。只执行当前中间件, 操作完成后,以出栈的顺序,依次返回上一级中间件。
gin.Default()默认使用了Logger和Recovery中间件,其中: Logger中间件将日志写入gin.DefaultWriter,即使配置了GIN_MODE=release。 Recovery中间件会recover任何panic。如果有panic的话,会写入500响应码。 如果不想使用上面两个默认的中间件,可以使用gin.New()新建一个没有任何默认中间件的路由。使用gin.New,如果不指定日志,那么在控制台中就不会有日志显示