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

Go Fiber 框架系列:中間件

開發 后端
Middleware(中間件) 是一個 Web 框架重要的組成部分,通過這種模式,可以方便的擴展框架的功能。目前 Go Web 框架都提供了 Middleware 的功能,也有眾多可用的 Middleware。

[[427280]]

大家好,我是 polarisxu。

Middleware(中間件) 是一個 Web 框架重要的組成部分,通過這種模式,可以方便的擴展框架的功能。目前 Go Web 框架都提供了 Middleware 的功能,也有眾多可用的 Middleware。

Fiber 也是如此,官方提供了眾多的 Middleware,方便用戶直接使用。本文先看看 Fiber 中 Middleware 的定義,然后介紹 Fiber 中的幾個 Middleware,最后自己實現一個 Middleware。

Fiber 文檔中關于 Middleware 的說明:中間件是在 HTTP 請求周期中鏈接的函數,它可以訪問用于執行特定操作(例如,記錄每個請求或啟用 CORS)的上下文。

01 Middleware 長什么樣

設計用于更改請求或響應的函數稱為中間件函數。Next 是 Fiber 路由器函數,當它被調用時,執行與當前路由匹配的下一個函數。

可見,中間件其實和 Handler 是一樣的,只是用途有區別。或者說至少簽名是一樣的,這樣才能更好的形成一個鏈。

因此,Fiber 中的中間件簽名如下:

  1. func(ctx *fiber.Ctx) error 

Fiber 沒有專門定義中間件類型。

此外,從 fiber.App.Use 方法也可以看到,中間件和普通的 Handler 并無本質不同。

  1. // Use registers a middleware route that will match requests 
  2. // with the provided prefix (which is optional and defaults to "/"). 
  3. // 
  4. //  app.Use(func(c *fiber.Ctx) error { 
  5. //       return c.Next() 
  6. //  }) 
  7. //  app.Use("/api", func(c *fiber.Ctx) error { 
  8. //       return c.Next() 
  9. //  }) 
  10. //  app.Use("/api", handler, func(c *fiber.Ctx) error { 
  11. //       return c.Next() 
  12. //  }) 
  13. // 
  14. // This method will match all HTTP verbs: GET, POST, PUT, HEAD etc... 
  15. func (app *App) Use(args ...interface{}) Router { 
  16.  var prefix string 
  17.  var handlers []Handler 
  18.  
  19.  for i := 0; i < len(args); i++ { 
  20.   switch arg := args[i].(type) { 
  21.   case string: 
  22.    prefix = arg 
  23.   case Handler: 
  24.    handlers = append(handlers, arg) 
  25.   default
  26.    panic(fmt.Sprintf("use: invalid handler %v\n", reflect.TypeOf(arg))) 
  27.   } 
  28.  } 
  29.  app.register(methodUse, prefix, handlers...) 
  30.  return app 

而 fiber.Handler 類型只是 func(*fiber.Ctx) error 的別名:

  1. // Handler defines a function to serve HTTP requests. 
  2. type Handler = func(*Ctx) error 

這點上,Gin 框架和 Fiber 是類似的。不過,有一些框架,比如 Echo,專門定義了中間件類型。但不管怎么樣,中間件的本質和普通路由 Handler 是類似的。

02 Fiber 內置的中間件

所有內置的中間件可以在 fiber 項目的 middleware 子包找到,這些中間件對應的文檔在這里:https://docs.gofiber.io/api/middleware。

以 Recover 中間件為例,看看官方中間件的實現方法,我們自己的中間件可以參照實現。

1)簽名

  1. func New(config ...Config) fiber.Handler 

上文說了,中間件就是一個 Handler,因此這里 New 函數返回 fiber.Handler,這就中間件。

至于 New 函數的參數不做任何要求,只需要最終返回 fiber.Handler 即可。

2)配置

一個好的中間件,或通用的中間件,一般都會有配置,讓中間件更靈活、更強大。看看 Recover 的配置定義:

  1. // Config defines the config for middleware. 
  2. type Config struct { 
  3.     // Next defines a function to skip this middleware when returned true
  4.     // 
  5.     // Optional. Default: nil 
  6.     Next func(c *fiber.Ctx) bool 
  7.  
  8.     // EnableStackTrace enables handling stack trace 
  9.     // 
  10.     // Optional. Defaultfalse 
  11.     EnableStackTrace bool 
  12.  
  13.     // StackTraceHandler defines a function to handle stack trace 
  14.     // 
  15.     // Optional. Default: defaultStackTraceHandler 
  16.     StackTraceHandler func(e interface{}) 

具體配置是什么樣的,需要根據中間件的功能來定義。

不過,配置中 Next 這個行為,很多中間件都可以有。

3)默認配置

一般的,會提供一個默認配置,方便使用。而且,大部分時候,使用默認配置即可。Recover 的默認配置如下:

  1. var ConfigDefault = Config{ 
  2.     Next:              nil, 
  3.     EnableStackTrace:  false
  4.     StackTraceHandler: defaultStackTraceHandler, 

如果這樣調用 recover.New() ,會默認使用上面的默認配置。

最后看看 New 函數的代碼:

  1. // New creates a new middleware handler 
  2. func New(config ...Config) fiber.Handler { 
  3.  // Set default config 
  4.  cfg := configDefault(config...) 
  5.  
  6.  // Return new handler 
  7.  return func(c *fiber.Ctx) (err error) { 
  8.   // Don't execute middleware if Next returns true 
  9.   if cfg.Next != nil && cfg.Next(c) { 
  10.    return c.Next() 
  11.   } 
  12.  
  13.   // Catch panics 
  14.   defer func() { 
  15.    if r := recover(); r != nil { 
  16.     if cfg.EnableStackTrace { 
  17.      cfg.StackTraceHandler(r) 
  18.     } 
  19.  
  20.     var ok bool 
  21.     if err, ok = r.(error); !ok { 
  22.      // Set error that will call the global error handler 
  23.      err = fmt.Errorf("%v", r) 
  24.     } 
  25.    } 
  26.   }() 
  27.  
  28.   // Return err if exist, else move to next handler 
  29.   return c.Next() 
  30.  } 

以上就是一個 Fiber 標準中間件的寫法。

具體使用時就是:app.Use(recover.New())。

當然,如果只是自己項目使用,可以不用寫配置。

03 實現一個簡單的中間件

通過 Recover 學習到了中間件的標準寫法,如果中間件只在自己項目使用,不需要靈活性,完全可以采用簡單的寫法。

  1. func Security(ctx *fiber.Ctx) error { 
  2.   ctx.Set("X-XSS-Protection""1; mode=block"
  3.   ctx.Set("X-Content-Type-Options""nosniff"
  4.   ctx.Set("X-Download-Options""noopen"
  5.   ctx.Set("Strict-Transport-Security""max-age=5184000"
  6.   ctx.Set("X-Frame-Options""SAMEORIGIN"
  7.   ctx.Set("X-DNS-Prefetch-Control""off"
  8.  
  9.   // 執行下一個 Handler 
  10.   return ctx.Next() 

這其實也是一個 Handler,對吧。無非最后調用的是 ctx.Next,而不是 ctx.JSON 之類的。

使用時這樣:

  1. app := fiber.New() 
  2. app.Use(Security) 

只要理解中間件的機制,不需要拘泥于具體形式,可以靈活變換中間件的寫法。

04 總結

 

本文講解了什么是中間件,Fiber 中間件長什么樣以及對內置中間件 Recover 的學習,最后自己實現一個簡單的中間件。掌握了 Fiber 的中間件,相信對其他 Go Web 框架的中間件的學習也就不難了,因為都差不多。

 

責任編輯:武曉燕 來源: polarisxu
相關推薦

2024-01-05 08:17:53

FiberGolang路由

2022-11-02 10:08:46

分布式高并發消息中間件

2024-12-09 00:00:15

Gin框架中間件

2024-02-06 14:05:00

Go中間件框架

2013-12-12 10:55:21

2015-12-21 14:56:12

Go語言Http網絡協議

2022-08-09 08:31:29

RocketMQ消息中間件

2022-11-18 07:54:02

Go中間件項目

2022-10-21 10:48:17

消息中間件互聯網應用協議

2021-09-26 05:05:46

GoFiber Express

2011-05-24 15:10:48

2021-02-11 08:21:02

中間件開發CRUD

2022-10-28 13:33:05

Push模式互聯網高并發

2021-10-12 18:32:17

Go框架測試

2016-11-11 21:00:46

中間件

2018-02-01 10:19:22

中間件服務器系統

2018-07-29 12:27:30

云中間件云計算API

2024-05-06 12:30:51

Go語言中間件

2012-11-30 10:21:46

移動中間件

2023-06-29 10:10:06

Rocket MQ消息中間件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成视频 | 国产成人免费 | 九九在线视频 | 精品国产31久久久久久 | 夜夜夜夜草 | 精品国产乱码久久久久久a丨 | 欧美专区在线 | 久久久精品 | 91视视频在线观看入口直接观看 | av电影一区二区 | 国产黄色在线观看 | 热99| 91福利网址 | 国产99久久久国产精品 | 欧美一级在线观看 | 成人在线视频网址 | 欧美视频二区 | 一级久久久久久 | 国内精品一区二区 | 黄色在线 | 欧美日韩免费视频 | 亚洲欧美日韩在线不卡 | 99精品国产一区二区三区 | 亚洲欧美成人影院 | 黄色永久免费 | 一区二区三区在线播放 | 久久综合久| 秋霞性生活 | 超碰成人免费观看 | 久久久久久久国产 | 一本大道久久a久久精二百 国产成人免费在线 | 免费在线观看一区二区 | 国产探花在线观看视频 | 国产一级片久久久 | 精精精精xxxx免费视频 | 成人在线视频免费观看 | 成人美女免费网站视频 | 成人一区二区电影 | 在线黄色影院 | 日韩在线视频精品 | 99久久99|