🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 设置默认中间件 ``` r := gin.New() // 没有中间件 r := gin.Default() //有中间件 ``` ## 三种中间件 ### 全局中间件 ``` r.Use(custromMidd) ``` ### 路由中间件 ``` r.GET("/benchmark", middleware(), benchEndpoint) ``` ### group 路由中间件 ``` authorized := r.Group("/") authorized.Use(AuthRequired()) { authorized.POST("/login", benchEndpoint) } ``` ## 定义中间件的两种方式 ``` r.Use(customMiddle()) // 方式一 func customMiddle(g *gin.Context) { foo1() g.Next() } // 方式二 func customMiddle() gin.HandlerFunc { Foo() // Foo() 将只执行一次,用于对某些第三方服务器的初始化 return func(c *gin.Context) { foo1() c.Next() } } ``` demo ``` func respondWithError(code int, message string,c *gin.Context) { resp := map[string]string{"error": message} c.JSON(code, resp) c.Abort() } func TokenAuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { token := c.Request.FormValue("api_token") if token == "" { respondWithError(401, "API token required", c) return } if token != os.Getenv("API_TOKEN") { respondWithError(401, "Invalid API token", c) return } c.Next() } } ``` ## 中间件的前置后置 ``` func Logger() gin.HandlerFunc { return func(c *gin.Context) { t := time.Now() // Set example variable c.Set("example", "12345") // before request c.Next() // after request latency := time.Since(t) log.Print(latency) // access the status we are sending status := c.Writer.Status() log.Println(status) } } ```