5.gin 中间件
5.1 全局中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
func MiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
fmt.Println("中间件开始执行!")
// 设置变量到Context的key中,可以通过Get()取
c.Set("request", "中间件")
status := c.Writer.Status()
fmt.Println("中间件执行完毕",status)
t2 := time.Since(t)
// 打印中间件执行了多长时间
fmt.Println("time", t2)
}
}
func main() {
r := gin.Default()
// 注册中间件
r.Use(MiddleWare())
{
r.GET("/ce", func(c *gin.Context) {
req, _ := c.Get("request")
fmt.Println("request:",req)
// 页面返回
c.JSON(200, gin.H{"request":req})
})
r.Run()
}
}
中间件开始执行!
中间件执行完毕 200
time 20.312µs
request: 中间件
5.2 Next方法
- Next()函数,仅可以在中间件使用,它在调用函数中执行挂起的函数。
func MiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
fmt.Println("中间件开始执行!")
// 设置变量到Context的key中,可以通过Get()取
c.Set("request", "中间件")
// 执行函数
c.Next()
status := c.Writer.Status()
fmt.Println("中间件执行完毕",status)
t2 := time.Since(t)
// 打印中间件执行了多长时间
fmt.Println("time", t2)
}
}
func main() {
r := gin.Default()
// 注册中间件
r.Use(MiddleWare())
{
r.GET("/ce", func(c *gin.Context) {
req, _ := c.Get("request")
fmt.Println("request:",req)
// 页面返回
c.JSON(200, gin.H{"request":req})
})
r.Run()
}
}
中间件开始执行!
request: 中间件 // 先执行request中间件
中间件执行完毕 200
time 37.267µs
5.3局部中间件
func main() {
r := gin.Default()
// 注册中间件
{
// MiddleWare 局部中间件
r.GET("/ce", MiddleWare(), func(c *gin.Context) {
req, _ := c.Get("request")
fmt.Println("request:",req)
// 页面返回
c.JSON(200, gin.H{"request":req})
})
r.Run()
}
}
5.4中间件练习
package main
import (
"fmt"
"time"
"github.com/gin-gonic/gin"
)
// 定义中间
func myTime(c *gin.Context) {
start := time.Now()
c.Next()
// 统计时间
since := time.Since(start)
fmt.Println("程序用时:", since)
}
func main() {
// 1.创建路由
// 默认使用了2个中间件Logger(), Recovery()
r := gin.Default()
// 注册中间件
r.Use(myTime)
// {}为了代码规范
shoppingGroup := r.Group("/shopping")
{
shoppingGroup.GET("/index", shopIndexHandler)
shoppingGroup.GET("/home", shopHomeHandler)
}
r.Run(":8000")
}
func shopIndexHandler(c *gin.Context) {
time.Sleep(5 * time.Second)
}
func shopHomeHandler(c *gin.Context) {
time.Sleep(3 * time.Second)
}