gin框架—中间件
中间件: gin框架允许开发者处理请求的过程中 加入自己的钩子函数(HOOK) 处理一些公共的逻辑
公共逻辑:登录认证 权限验证 数据分页 记录日志 耗时统计等等…
1.全局中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
//定义一个中间件
func MiddlerWare() gin.HandlerFunc {
return func(c *gin.Context){
t := time.Now()
fmt.Println("中间件开始了!")
//在Context中设置key-value
c.Set("request","中间件")
status := c.Writer.Status() //返回当前请求的响应的状态码-->int
fmt.Println("中间件执行完毕",status)
t2 := time.Since(t) //计算此时的时间和t时间之间的时间差--->Duration 等价于:time.Now().Sub(t)
fmt.Println("time:",t2)
}
}
func main() {
//中间件
r := gin.Default()
//注册我们要使用的中间件(全局)
r.Use(MiddlerWare())
{
r.GET("/chenjunde",func(c *gin.Context){
//取出中间Set的值
req , _ := c.Get("request")
fmt.Println("request:",req)
c.JSON(200,gin.H{"request": req})
})
}
r.Run()
}
[GIN-debug] Listening and serving HTTP on :8080
中间件开始了!
中间件执行完毕 200
time: 1.0619ms
request: 中间件
[GIN] 2021/09/24 - 10:20:57 |?[97;42m 200 ?[0m| 2.099ms | 127.0.0.1 |?[97;44m GET ?[0m "/chenjunde"
中间件开始了!
中间件执行完毕 404
time: 213µs
2.Next()函数的用法
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
//定义一个中间件
func MiddlerWare() gin.HandlerFunc {
return func(c *gin.Context){
t := time.Now()
fmt.Println("中间件开始了!")
//在Context中设置key-value
c.Set("request","中间件")
//使用Next()函数跳转到后面的函数执行
c.Next()
//后续函数执行完毕后继续执行像下面的代码
status := c.Writer.Status() //返回当前请求的响应的状态码-->int
fmt.Println("中间件执行完毕",status)
t2 := time.Since(t) //计算此时的时间和t时间之间的时间差--->Duration 等价于:time.Now().Sub(t)
fmt.Println("time:",t2)
}
}
func main() {
//中间件
r := gin.Default()
//注册我们要使用的中间件(全局)
r.Use(MiddlerWare())
{
r.GET("/chenjunde",func(c *gin.Context){
//取出中间Set的值
req , _ := c.Get("request")
fmt.Println("request:",req)
c.JSON(200,gin.H{"request": req})
})
}
r.Run()
}
3.About()函数
4.作用在特定的请求中的中间件(局部中间件)
只是特定的请求需要走中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
//定义一个中间件
func MiddlerWare() gin.HandlerFunc {
return func(c *gin.Context){
t := time.Now()
fmt.Println("中间件开始了!")
//在Context中设置key-value
c.Set("request","中间件")
//使用Next()函数跳转到后面的函数执行
c.Next()
//后续函数执行完毕后继续执行像下面的代码
status := c.Writer.Status() //返回当前请求的响应的状态码-->int
fmt.Println("中间件执行完毕",status)
t2 := time.Since(t) //计算此时的时间和t时间之间的时间差--->Duration 等价于:time.Now().Sub(t)
fmt.Println("time:",t2)
}
}
func main() {
//中间件
r := gin.Default()
//注册我们要使用的中间件(全局)
r.GET("/chenjunde",MiddlerWare(),func(c *gin.Context){ // <-可以设置多个中间件
//取出中间Set的值
req , _ := c.Get("request")
fmt.Println("request:",req)
c.JSON(200,gin.H{"request": req})
})
r.Run()
}
5.中间件的练习
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
//定义一个记录时间的中间件
func MiddlerWare() gin.HandlerFunc {
return func(c *gin.Context){
t := time.Now() //当前时间
fmt.Println("中间件开始记时")
//Next函数执行下面HandlerFunc
c.Next()
time := time.Since(t)
fmt.Println("用时:",time)
fmt.Println("中间件执行完毕")
}
}
func main() {
//中间件
r := gin.Default()
//使用全局的中间件
r.Use(MiddlerWare())
//定义路由组
g := r.Group("/chenjunde")
{
g.GET("/index",IndexFunc)
g.GET("/login",LoginFunc)
}
r.Run()
}
func IndexFunc(c *gin.Context){
time.Sleep(time.Second*3)
}
func LoginFunc(c *gin.Context){
time.Sleep(time.Second*5)
}
返回的结果:
[GIN-debug] Listening and serving HTTP on :8080
中间件开始记时
用时: 5.0039974s
中间件执行完毕
中间件开始记时
用时: 3.0028899s
中间件执行完毕