接受一个请求,对其进行处理,每个中间件只处理一件事情,完成后将其传递给另一个中间件或最终处理程序,这样就做到了程序的解耦。
局部中间件
给某一个路由单独走中间件,其他路由不走这个中间件
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"time"
)
func MiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
time.Sleep(5)
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.GET("/", func(c *gin.Context) {
c.String(200, "Hello, Geektutu")
})
// 局部使用
r.GET("/get_info", MiddleWare(),func(c *gin.Context) {
c.JSON(200,gin.H{
"info":"成功",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
执行结果
全局中间件
所有的请求都要经过此中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"time"
)
func MiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
time.Sleep(5)
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("/", func(c *gin.Context) {
c.String(200, "Hello, Geektutu")
})
r.GET("/get_info", func(c *gin.Context) {
c.JSON(200,gin.H{
"info":"成功",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
执行结果
Next() 方法
在执行next函数的时候,中间件中next函数下面的代码暂时不执行了,先去路由函数执行完成了之后再去执行next后面的代码。