成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Gin 框架怎么使用中間件?

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

1.介紹

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

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

2.使用中間件

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

示例代碼:

func main() {
    // 新建一個沒有任何默認中間件的路由
    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")
}

閱讀上面這段代碼,我們可以發現,Gin 框架使用 Use 方法,使用中間件,包含默認中間件和自定義中間件。

3.自定義中間件

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

我們先閱讀默認中間件 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)
}

閱讀默認中間件 Recovery 的源碼,我們可以發現,Gin 框架中間件,就是一個有 HandlerFunc 類型返回值的函數。

我們閱讀 CustomRecoveryWithWriter 函數的源碼,可以發現 c.Next() 方法,該方法只在中間件內部使用。

它的作用是,當代碼執行到 c.Next() 方法,會先調用后續的處理函數,最后再執行完當前函數的代碼。

自定義中間件:

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")
 }
}

輸出結果:

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

abc
111
333
222
ghi
def

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

通過輸出結果,我們可以發現,代碼執行順序是,先正序分別執行三個中間件的 c.Next() 方法之前的代碼。

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

4.總結

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

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

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

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

中間件前端設計模式

2011-05-24 15:10:48

2021-02-11 08:21:02

中間件開發CRUD

2025-02-08 11:49:42

2016-11-11 21:00:46

中間件

2018-02-01 10:19:22

中間件服務器系統

2018-07-29 12:27:30

云中間件云計算API

2022-11-18 07:54:02

Go中間件項目

2012-11-30 10:21:46

移動中間件

2009-06-16 15:55:06

JBoss企業中間件

2023-10-24 07:50:18

消息中間件MQ

2023-06-29 10:10:06

Rocket MQ消息中間件

2022-12-26 00:00:01

Go框架前端

2011-10-24 07:41:38

SOA中間件應用服務器

2021-04-22 06:13:41

Express 中間件原理中間件函數

2015-02-07 21:52:45

PaaS中間件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男女羞羞视频在线 | 99久热在线精品视频观看 | 男女视频在线观看 | 成人免费共享视频 | 欧美精品福利 | 欧美成人精品欧美一级 | 狠狠的干 | 中文字幕av网站 | 国产精品久久久久久二区 | 亚洲一区二区成人 | 日本在线网站 | 99久久国产综合精品麻豆 | 亚洲国产精品久久久久 | 91aiai| 欧美一级大片免费观看 | 亚洲成人免费 | 日韩在线看片 | 欧美日韩国产一区二区三区 | 日韩一二区在线 | 拍戏被cao翻了h承欢 | 色综合天天综合网国产成人网 | 亚洲综合色视频在线观看 | 欧美啪啪| 久久精品亚洲精品国产欧美 | 性高湖久久久久久久久3小时 | 国产精品一区二区在线播放 | 国产精品久久久久影院色老大 | 亚州成人 | 免费a网| 久久国产精品一区二区三区 | 国产成人一区二区三区 | 热久久免费视频 | 91精品国产综合久久国产大片 | 91香蕉嫩草 | 夜夜草 | 99久久婷婷国产综合精品首页 | 天天躁日日躁狠狠很躁 | 亚洲一区二区精品视频 | 欧美人妇做爰xxxⅹ性高电影 | 久久国产精品首页 | 久久久精 |