日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Go Fiber 框架系列:中間件

大家好,我是 polarisxu。

創(chuàng)新互聯(lián)建站長(zhǎng)期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為高臺(tái)企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè),高臺(tái)網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

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

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

Fiber 文檔中關(guān)于 Middleware 的說(shuō)明:中間件是在 HTTP 請(qǐng)求周期中鏈接的函數(shù),它可以訪問(wèn)用于執(zhí)行特定操作(例如,記錄每個(gè)請(qǐng)求或啟用 CORS)的上下文。

01 Middleware 長(zhǎng)什么樣

設(shè)計(jì)用于更改請(qǐng)求或響應(yīng)的函數(shù)稱為中間件函數(shù)。Next 是 Fiber 路由器函數(shù),當(dāng)它被調(diào)用時(shí),執(zhí)行與當(dāng)前路由匹配的下一個(gè)函數(shù)。

可見(jiàn),中間件其實(shí)和 Handler 是一樣的,只是用途有區(qū)別?;蛘哒f(shuō)至少簽名是一樣的,這樣才能更好的形成一個(gè)鏈。

因此,F(xiàn)iber 中的中間件簽名如下:

 
 
 
  1. func(ctx *fiber.Ctx) error 

Fiber 沒(méi)有專門(mén)定義中間件類(lèi)型。

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

 
 
 
  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 類(lèi)型只是 func(*fiber.Ctx) error 的別名:

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

這點(diǎn)上,Gin 框架和 Fiber 是類(lèi)似的。不過(guò),有一些框架,比如 Echo,專門(mén)定義了中間件類(lèi)型。但不管怎么樣,中間件的本質(zhì)和普通路由 Handler 是類(lèi)似的。

02 Fiber 內(nèi)置的中間件

所有內(nèi)置的中間件可以在 fiber 項(xiàng)目的 middleware 子包找到,這些中間件對(duì)應(yīng)的文檔在這里:https://docs.gofiber.io/api/middleware。

以 Recover 中間件為例,看看官方中間件的實(shí)現(xiàn)方法,我們自己的中間件可以參照實(shí)現(xiàn)。

1)簽名

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

上文說(shuō)了,中間件就是一個(gè) Handler,因此這里 New 函數(shù)返回 fiber.Handler,這就中間件。

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

2)配置

一個(gè)好的中間件,或通用的中間件,一般都會(huì)有配置,讓中間件更靈活、更強(qiáng)大。看看 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. Default: false 
  11.     EnableStackTrace bool 
  12.  
  13.     // StackTraceHandler defines a function to handle stack trace 
  14.     // 
  15.     // Optional. Default: defaultStackTraceHandler 
  16.     StackTraceHandler func(e interface{}) 

具體配置是什么樣的,需要根據(jù)中間件的功能來(lái)定義。

不過(guò),配置中 Next 這個(gè)行為,很多中間件都可以有。

3)默認(rèn)配置

一般的,會(huì)提供一個(gè)默認(rèn)配置,方便使用。而且,大部分時(shí)候,使用默認(rèn)配置即可。Recover 的默認(rèn)配置如下:

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

如果這樣調(diào)用 recover.New() ,會(huì)默認(rèn)使用上面的默認(rèn)配置。

最后看看 New 函數(shù)的代碼:

 
 
 
  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.  } 

以上就是一個(gè) Fiber 標(biāo)準(zhǔn)中間件的寫(xiě)法。

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

當(dāng)然,如果只是自己項(xiàng)目使用,可以不用寫(xiě)配置。

03 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的中間件

通過(guò) Recover 學(xué)習(xí)到了中間件的標(biāo)準(zhǔn)寫(xiě)法,如果中間件只在自己項(xiàng)目使用,不需要靈活性,完全可以采用簡(jiǎn)單的寫(xiě)法。

 
 
 
  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.   // 執(zhí)行下一個(gè) Handler 
  10.   return ctx.Next() 

這其實(shí)也是一個(gè) Handler,對(duì)吧。無(wú)非最后調(diào)用的是 ctx.Next,而不是 ctx.JSON 之類(lèi)的。

使用時(shí)這樣:

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

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

04 總結(jié)

本文講解了什么是中間件,F(xiàn)iber 中間件長(zhǎng)什么樣以及對(duì)內(nèi)置中間件 Recover 的學(xué)習(xí),最后自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的中間件。掌握了 Fiber 的中間件,相信對(duì)其他 Go Web 框架的中間件的學(xué)習(xí)也就不難了,因?yàn)槎疾畈欢唷?/p>
當(dāng)前標(biāo)題:Go Fiber 框架系列:中間件
本文路徑:http://m.5511xx.com/article/cocjpic.html