- 中间件使用者从大到小可以分为3个:
所有路由使用:r := gin.Default();r.Use(midware1,midware2)
路由组:g1:=r.Group("/g1");g1.Use(midware1,midware1)
单个路由使用:r.GET("/m1", midware1, midware2, handler1)
参数里可以添加任意个中间件 - 如果在某个中间件内部调用了c.Next(),会提前调用下一个中间件,等处理完之后的所有中间件和handler之后,继续执行本中间件c.Next()之后的代码。如果没有调用c.Next(),可认为会在当前中间件return之前调用c.Next()
- 如果在某个中间件内部调用了c.Abort(),之后的中间件和handler都不再被调用
- 如果在某个中间件内部做了重定向,页面会进行重定向,但之后的中间件和handler还是会被调用。重定向前建议加上abort
- 中间件传值:先执行的中间件c.Set(key,val),再后执行的中间件c.Get(key)即可。val可以是任意类型,如果没有值返回nil
- start:=time.Now();*******;time.Since(start)可以计算间隔的数据
pacpackage main
import (
"fmt"
"html/template"
"log"
"mime/multipart"
"net/http"
"path"
"time"
"github.com/gin-gonic/gin"
)
func main() {
mainGin()
}
type UserInfo struct {
Name string
Gender bool
Age int
}
func midware1(c *gin.Context) {
log.Println("m1 start>>")
start:=time.Now()
c.Set("person",UserInfo{"柯南",true,6})
c.Next()
log.Println("<<m1 end",time.Since(start))
}
func midware2(c *gin.Context) {
log.Println("m2 start>>")
userInfo,ok:=c.Get("person")
if ok || !ok{
fmt.Printf("%v",userInfo)
}
log.Println("<<m2 end")
}
func handler1(c *gin.Context) {
log.Println("h1 start>>")
c.JSON(http.StatusOK, gin.H{"msg": "test middleware"})
log.Println("<<h1 end")
}
func mainGin() {
r := gin.Default()
r.LoadHTMLFiles(******************)
r.GET("/m1", midware1, midware2, handler1)
r.GET("/m2", midware2, midware1, handler1)
g1 := r.Group("/g1")
{
g1.GET("/1", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"msg": "g11"})
})
g1.POST("/2", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"msg": "g12"})
})
g2 := g1.Group("/g2")
{
g2.GET("/3", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"msg": "g23"})
})
}
}