gin的简单实用 | 青训营笔记

47 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记,主要简单介绍一下gin框架的使用,Gin是Go(Golang)编写的Web框架。他是一个类似于martini但拥有更好性能的API框架。

1.绑定结构体

需要在后面添加json、uri和form等字段

type PostParam struct {
   Name string `json:"name" uri:"name" form:"name"`
   Age  int    `json:"age" uri:"age" form:"age"`
   Sex  bool   `json:"sex" uri:"sex" form:"sex"`
}

1.1绑定json

r.PUT("/path", func(c *gin.Context) {
   var p PostParam
   err := c.ShouldBindJSON(&p) //把传入的json数据绑定到p中
   if err != nil {
      c.JSON(404, gin.H{
         "message": "报错啦",
         "data":    gin.H{},
      })
   } else {

      c.JSON(200, gin.H{
         "message": "成功啦",
         "name":    p.Name,
         "age":     p.Age,
         "sex":     p.Sex,
      })
   }
})

1.2绑定uri

r.PUT("/path/:name/:age/:sex", func(c *gin.Context) {
   var p PostParam
   err := c.ShouldBindUri(&p) //把传入的json数据绑定到p中
   if err != nil {
      c.JSON(404, gin.H{
         "message": "报错啦",
         "data":    gin.H{},
      })
   } else {

      c.JSON(200, gin.H{
         "message": "成功啦",
         "name":    p.Name,
         "age":     p.Age,
         "sex":     p.Sex,
      })
   }
})

1.3绑定query

r.PUT("/path/:name/:age/:sex", func(c *gin.Context) {
   var p PostParam
   err := c.ShouldBindUri(&p) //把传入的json数据绑定到p中
   if err != nil {
      c.JSON(404, gin.H{
         "message": "报错啦",
         "data":    gin.H{},
      })
   } else {

      c.JSON(200, gin.H{
         "message": "成功啦",
         "name":    p.Name,
         "age":     p.Age,
         "sex":     p.Sex,
      })
   }
})

1.4表单验证

  • 使用binding关键字,绑定验证方法(required是该框架自带的,mustBig是自己定义的,指明需要验证的逻辑)
  • 实现自己定义的验证方式
  • 在main方法中对自定义验证方法进行注册
type PostParam struct {
	Name string `json:"name" `
	Age  int    `json:"age" binding:"required,mustBig"`
	Sex  bool   `json:"sex" `
}

func mustBig(f1 validator.FieldLevel) bool {
	fmt.Println("ddddddd")
	fmt.Println(f1.Field())
	if f1.Field().Interface().(int) <= 18 {
		return false
	}
	return true
}
func main() {
	r := gin.Default() //启动了gin的路由
    //对验证方法进行绑定
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		v.RegisterValidation("mustBig", mustBig)
	}
}

2.gin的路由分组和中间件

2.1路由分组

可以对路由进行分组,对组进行统一管理,使路由结构更加清晰

func main() {
	r := gin.Default() //启动了gin的路由
	v1 := r.Group("v1")
	v1.GET("test", func(c *gin.Context) {
		fmt.Println("我在路由分组内部")
		c.JSON(200, gin.H{
			"msg": "success",
		})
	})
	r.Run(":1010") // listen and serve on 0.0.0.0:8080
}

2.2中间件

2.2.1中间件的介绍

定义:在请求到达路由的方法的前和后进行一系列操作

使用方式:在路由器(路由组)上进行use操作,后面传入中间函数即可。

Use函数的定义

func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes

首先,我们可以通过Gin提供的默认函数,来构建一个自带默认中间件的*Engine

r := gin.Default()

Default函数会默认绑定两个已经准备好的中间件,包括Logger 和 Recovery,帮助我们打印日志输出和panic处理。

func Default() *Engine {
    debugPrintWARNINGDefault()
    engine := New()
    engine.Use(Logger(), Recovery())
    return engine
}

2.2.2自定义中间件

  • 定义一个HandlerFunc 例如定义一个中间件在请求路由方法前后打印一些话
func printSome() gin.HandlerFunc {
    return func(c *gin.Context) {
        fmt.Print("路由方法执行前------")
        
        //请求处理
        c.Next()
 
        
        fmt.Print("路由方法执行后------")
    }
}
  • 使用自定义中间件
func main() {
    r := gin.New()
 
    r.Use(printSome())
 
    r.GET("/", func(c *gin.Context) {
        c.JSON(200, "首页")
    })
 
    r.Run(":8080")
}