來源:腳本之家
2023-04-28 05:59:18
中間件是放在客戶端和服務(wù)端的中間。
當(dāng)你的客戶端對(duì)某個(gè)接口發(fā)起一個(gè)請(qǐng)求,但是在到達(dá)接口2之前,這里是有一層中間件的處理。
【資料圖】
一般常用的就是處理跨域,比如處理登入的驗(yàn)證token,接口返回的信息比較敏感,說白了就是需要做鑒權(quán)。其實(shí)也就是防止別人刷你接口,拿到你的數(shù)據(jù)。
也就是你必須攜帶正確的token,讓中間件去做驗(yàn)證,做完驗(yàn)證之后再去處理這個(gè)接口的邏輯。
Gin框架允許開發(fā)者在處理請(qǐng)求的過程中,加入用戶自己的鉤子(Hook)函數(shù)(鉤子函數(shù)其實(shí)就是中間件)。這個(gè)鉤子函數(shù)就叫中間件,中間件適合處理一些公共的業(yè)務(wù)邏輯 ,比如 登錄認(rèn)證 、 權(quán)限校驗(yàn) 、數(shù)據(jù)分頁(yè)、記錄日志、耗時(shí)統(tǒng)計(jì)等(比如微服務(wù)架構(gòu),你要去統(tǒng)計(jì)每個(gè)服務(wù)的metrics,比如請(qǐng)求的耗時(shí),請(qǐng)求的狀態(tài)碼,也可以通過這個(gè)中間件去實(shí)現(xiàn))全局中間件對(duì)所有的路由都生效。
如果先注冊(cè)了路由器,我再去use這個(gè)中間件,發(fā)現(xiàn)這個(gè)中間件沒有生效,這個(gè)是正常的,因?yàn)橹虚g件是在路由之后,那么注冊(cè)中間件就是失效的, 中間件一定要在路由之前注冊(cè)。
HandlerFunc這個(gè)其實(shí)也就是接受上下文對(duì)匿名函數(shù)。
type HandlerFunc func(*Context)
這里很像一個(gè)閉包的用法,我們只能在函數(shù)當(dāng)中定義,但是沒有辦法去改變其一些變量。它不想讓你去改變其一些配置,它只允許你寫部分對(duì)實(shí)現(xiàn)。
import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) //全局中間件,對(duì)所有路由生效,必須在路由注冊(cè)之前去use func MiddleWare() gin.HandlerFunc { return func(c *gin.Context) { //返回一個(gè)匿名函數(shù) fmt.Println("我是一個(gè)中間件") } } func main() { r := gin.Default() r.Use(MiddleWare()) r.GET("/hello", func(c *gin.Context) { fmt.Println("執(zhí)行了get方法") c.String(http.StatusOK, "hello") c.JSON(http.StatusOK, gin.H{ "msg": "success", "data": "hello", }) }) r.Run(":8000") }
[GIN-debug] Listening and serving HTTP on :8000 我是一個(gè)中間件 執(zhí)行了get方法 [GIN] 2023/04/03 - 10:58:24 | 200 | 44.667μs | 127.0.0.1 | GET "/hello"
這里可以看到中間件是先執(zhí)行,中間件比路由的handler是先執(zhí)行的。
局部中間件就是對(duì)某個(gè)路由生效,這個(gè)就沒有順序了,因?yàn)樗歉?cè)路由一起走的。
import ( "fmt" "github.com/gin-gonic/gin" ) func MiddleWare() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("這里可以做一些身份驗(yàn)證等") } } func main() { r := gin.Default() // 首頁(yè)無需驗(yàn)證 r.GET("/index", func(c *gin.Context) { c.JSON(200, gin.H{"msg": "index 頁(yè)面"}) }) // home頁(yè)需要用戶登錄才能查看 r.GET("/home", MiddleWare(), func(c *gin.Context) { c.JSON(200, gin.H{"msg": "home 頁(yè)面"}) }) r.Run() }
可以看到在返回日志之前去執(zhí)行了這個(gè)中間件,這就是一個(gè)局部中間件對(duì)用法。(先去執(zhí)行中間件再去執(zhí)行handler,這個(gè)局部中間件只對(duì)上面的路由生效)
[GIN-debug] Listening and serving HTTP on :8000 [GIN] 2023/04/03 - 11:14:11 | 200 | 56.791μs | 127.0.0.1 | GET "/index" 這里可以做一些身份驗(yàn)證 [GIN] 2023/04/03 - 11:14:17 | 200 | 31.291μs | 127.0.0.1 | GET "/home"
某些中間件需要特殊處理的話,使用局部中間件就好了。
如果中間件有很多公用的方法,那么大部分情況就是全局的中間件,而不是局部的中間件。其實(shí)大部分使用場(chǎng)景都是使用全局中間件。
到此這篇關(guān)于Golang Gin局部和全局中間件使用詳解的文章就介紹到這了,更多相關(guān)Golang Gin局部和全局中間件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
關(guān)鍵詞: