自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Gin 框架怎么使用中間件?

開發(fā) 前端
本文我們介紹 Gin 框架怎么使用中間件,包括全局中間件、路由中間件、路由組中間件。我們還介紹了怎么自定義中間件,以及中間件使用的 c.Next() 方法的執(zhí)行順序。

1.介紹

在 Gin 框架中,HTTP 請(qǐng)求可以由一系列中間件和最終操作來處理。

本文我們介紹怎么使用中間件。

2.使用中間件

Gin 框架使用中間件,分為全局中間件、路由中間件、路由組中間件。

示例代碼:

func main() {
    // 新建一個(gè)沒有任何默認(rèn)中間件的路由
    r := gin.New()
    // 全局中間件
    r.Use(gin.Logger())
    r.Use(gin.Recovery())
    // 路由中間件
    r.GET("/benchmark", MyBenchLogger(), benchEndpoint))
    // 路由組中間件
    authorized := r.Group("/")
    authorized.Use(AuthRequired())
    {
        authorized.POST("/login", loginEndpoint)
        authorized.POST("/submit", submitEndpoint)
        authorized.POST("/read", readEndpoint)
        // 嵌套路由組
        testing := authorized.Group("testing")
        testing.GET("/analytics", analyticsEndpoint)
    }
    r.Run(":8080")
}

閱讀上面這段代碼,我們可以發(fā)現(xiàn),Gin 框架使用 Use 方法,使用中間件,包含默認(rèn)中間件和自定義中間件。

3.自定義中間件

Gin 框架除了使用默認(rèn)中間件,還可以自定義中間件。

我們先閱讀默認(rèn)中間件 Recovery 的源碼。

// Recovery returns a middleware that recovers from any panics and writes a 500 if there was one.
func Recovery() HandlerFunc {
 return RecoveryWithWriter(DefaultErrorWriter)
}

// RecoveryWithWriter returns a middleware for a given writer that recovers from any panics and writes a 500 if there was one.
func RecoveryWithWriter(out io.Writer, recovery ...RecoveryFunc) HandlerFunc {
 if len(recovery) > 0 {
  return CustomRecoveryWithWriter(out, recovery[0])
 }
 return CustomRecoveryWithWriter(out, defaultHandleRecovery)
}

閱讀默認(rèn)中間件 Recovery 的源碼,我們可以發(fā)現(xiàn),Gin 框架中間件,就是一個(gè)有 HandlerFunc 類型返回值的函數(shù)。

我們閱讀 CustomRecoveryWithWriter 函數(shù)的源碼,可以發(fā)現(xiàn) c.Next() 方法,該方法只在中間件內(nèi)部使用。

它的作用是,當(dāng)代碼執(zhí)行到 c.Next() 方法,會(huì)先調(diào)用后續(xù)的處理函數(shù),最后再執(zhí)行完當(dāng)前函數(shù)的代碼。

自定義中間件:

func main() {
 r := gin.Default()
 r.GET("/", func(c *gin.Context) {
  c.JSON(200, gin.H{
   "ping": "pong",
  })
 }, MyMiddleware1(), MyMiddleware2())
 err := r.Run(":8080")
 if err != nil {
  return
 }
}

func MyMiddleware1() gin.HandlerFunc {
 return func(c *gin.Context) {
  fmt.Println("abc")
  defer func() {
   fmt.Println("def")
  }()
  c.Next()
  fmt.Println("ghi")
 }
}

func MyMiddleware2() gin.HandlerFunc {
 return func(c *gin.Context) {
  fmt.Println("111")
  defer func() {
   fmt.Println("222")
  }()
  c.Next()
  fmt.Println("333")
 }
}

輸出結(jié)果:

curl -s -X GET http://127.0.0.1:8080 | jq
{
  "ping": "pong"
}

abc
111
333
222
ghi
def

閱讀上面這段代碼,我們定義三個(gè)中間件函數(shù),其中每個(gè)中間件函數(shù)中都使用 c.Next() 方法。

通過輸出結(jié)果,我們可以發(fā)現(xiàn),代碼執(zhí)行順序是,先正序分別執(zhí)行三個(gè)中間件的 c.Next() 方法之前的代碼。

然后,再倒序分別執(zhí)行三個(gè)中間件 c.Next() 方法之后的代碼。

4.總結(jié)

本文我們介紹 Gin 框架怎么使用中間件,包括全局中間件、路由中間件、路由組中間件。

我們還介紹了怎么自定義中間件,以及中間件使用的 c.Next() 方法的執(zhí)行順序。

責(zé)任編輯:武曉燕 來源: Golang語言開發(fā)棧
相關(guān)推薦

2024-02-06 14:05:00

Go中間件框架

2024-07-29 00:01:00

2021-10-06 19:03:35

Go中間件Middleware

2020-12-14 09:12:53

Golang GinJsonWebToke前后端

2020-08-19 08:39:05

中間件前端設(shè)計(jì)模式

2021-02-11 08:21:02

中間件開發(fā)CRUD

2011-05-24 15:10:48

2025-02-08 11:49:42

2018-07-29 12:27:30

云中間件云計(jì)算API

2018-02-01 10:19:22

中間件服務(wù)器系統(tǒng)

2022-11-18 07:54:02

Go中間件項(xiàng)目

2016-11-11 21:00:46

中間件

2023-06-29 10:10:06

Rocket MQ消息中間件

2023-10-24 07:50:18

消息中間件MQ

2009-06-16 15:55:06

JBoss企業(yè)中間件

2012-11-30 10:21:46

移動(dòng)中間件

2022-12-26 00:00:01

Go框架前端

2012-11-01 15:16:22

金蝶中間件研究院院長

2021-06-15 10:01:02

應(yīng)用系統(tǒng)軟件

2013-03-14 22:54:15

PaaS中間件平臺(tái)即服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)