第六届字节跳动青训营——Gin框架学习实践之路第三节 | 青训营

66 阅读3分钟

内容概述

本文主要记录了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"
  1. 针对字符串的长度
  • min 最小长度,如:binding:"min=5"
  • max 最大长度,如:binding:"max=10"
  • len 长度,如:binding:"len=6"
  1. 针对数字的大小
  • eq 等于,如:binding:"eq=3"
  • ne 不等于,如:binding:"ne=12"
  • gt 大于,如:binding:"gt=10"
  • gte 大于等于,如:binding:"gte=10"
  • lt 小于,如:binding:"lt=10"
  • lte 小于等于,如:binding:"lte=10"
  1. 针对同级字段的
  • 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,如果不指定日志,那么在控制台中就不会有日志显示