Golang Gin局部和全局中間件使用詳解
中間件

中間件是放在客戶端和服務(wù)端的中間。
當(dāng)你的客戶端對某個接口發(fā)起一個請求,但是在到達(dá)接口2之前,這里是有一層中間件的處理。
一般常用的就是處理跨域,比如處理登入的驗證token,接口返回的信息比較敏感,說白了就是需要做鑒權(quán)。其實也就是防止別人刷你接口,拿到你的數(shù)據(jù)。
也就是你必須攜帶正確的token,讓中間件去做驗證,做完驗證之后再去處理這個接口的邏輯。
- Gin框架允許開發(fā)者在處理請求的過程中,加入用戶自己的鉤子(Hook)函數(shù)(鉤子函數(shù)其實就是中間件)。
- 這個鉤子函數(shù)就叫中間件,中間件適合處理一些公共的業(yè)務(wù)邏輯 ,比如 登錄認(rèn)證 、 權(quán)限校驗 、數(shù)據(jù)分頁、記錄日志、耗時統(tǒng)計等(比如微服務(wù)架構(gòu),你要去統(tǒng)計每個服務(wù)的metrics,比如請求的耗時,請求的狀態(tài)碼,也可以通過這個中間件去實現(xiàn))
1. 全局中間件
全局中間件對所有的路由都生效。
如果先注冊了路由器,我再去use這個中間件,發(fā)現(xiàn)這個中間件沒有生效,這個是正常的,因為中間件是在路由之后,那么注冊中間件就是失效的, 中間件一定要在路由之前注冊。
HandlerFunc這個其實也就是接受上下文對匿名函數(shù)。
type HandlerFunc func(*Context)
這里很像一個閉包的用法,我們只能在函數(shù)當(dāng)中定義,但是沒有辦法去改變其一些變量。它不想讓你去改變其一些配置,它只允許你寫部分對實現(xiàn)。
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
//全局中間件,對所有路由生效,必須在路由注冊之前去use
func MiddleWare() gin.HandlerFunc {
return func(c *gin.Context) { //返回一個匿名函數(shù)
fmt.Println("我是一個中間件")
}
}
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 我是一個中間件 執(zhí)行了get方法 [GIN] 2023/04/03 - 10:58:24 | 200 | 44.667μs | 127.0.0.1 | GET "/hello"
這里可以看到中間件是先執(zhí)行,中間件比路由的handler是先執(zhí)行的。
2. 局部中間件
局部中間件就是對某個路由生效,這個就沒有順序了,因為它是跟著注冊路由一起走的。
import (
"fmt"
"github.com/gin-gonic/gin"
)
func MiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("這里可以做一些身份驗證等")
}
}
func main() {
r := gin.Default()
// 首頁無需驗證
r.GET("/index", func(c *gin.Context) {
c.JSON(200, gin.H{"msg": "index 頁面"})
})
// home頁需要用戶登錄才能查看
r.GET("/home", MiddleWare(), func(c *gin.Context) {
c.JSON(200, gin.H{"msg": "home 頁面"})
})
r.Run() }可以看到在返回日志之前去執(zhí)行了這個中間件,這就是一個局部中間件對用法。(先去執(zhí)行中間件再去執(zhí)行handler,這個局部中間件只對上面的路由生效)
[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" 這里可以做一些身份驗證 [GIN] 2023/04/03 - 11:14:17 | 200 | 31.291μs | 127.0.0.1 | GET "/home"
某些中間件需要特殊處理的話,使用局部中間件就好了。
如果中間件有很多公用的方法,那么大部分情況就是全局的中間件,而不是局部的中間件。其實大部分使用場景都是使用全局中間件。
到此這篇關(guān)于Golang Gin局部和全局中間件使用詳解的文章就介紹到這了,更多相關(guān)Golang Gin局部和全局中間件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GoLang RabbitMQ實現(xiàn)六種工作模式示例
這篇文章主要介紹了GoLang RabbitMQ實現(xiàn)六種工作模式,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12
golang并發(fā)執(zhí)行的幾種方式小結(jié)
本文主要介紹了golang并發(fā)執(zhí)行的幾種方式小結(jié),主要包括了Channel,WaitGroup ,Context,使用這三種機(jī)制中的一種或者多種可以達(dá)到并發(fā)控制很好的效果,具有一定的參考價值,感興趣的可以了解一下2023-08-08
Golang編程實現(xiàn)生成n個從a到b不重復(fù)隨機(jī)數(shù)的方法
這篇文章主要介紹了Golang編程實現(xiàn)生成n個從a到b不重復(fù)隨機(jī)數(shù)的方法,結(jié)合實例形式分析了Go語言字符串操作及隨機(jī)數(shù)生成的相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
go slice 數(shù)組和切片使用區(qū)別示例解析
這篇文章主要為大家介紹了go slice 數(shù)組和切片使用區(qū)別示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
GO 使用Webhook 實現(xiàn)github 自動化部署的方法
這篇文章主要介紹了GO 使用Webhook 實現(xiàn)github 自動化部署的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Golang標(biāo)準(zhǔn)庫之errors包應(yīng)用方式
Go語言的errors包提供了基礎(chǔ)的錯誤處理能力,允許通過errors.New創(chuàng)建自定義error對象,error在Go中是一個接口,通過實現(xiàn)Error方法來定義錯誤文本,對錯誤的比較通常基于對象地址,而非文本內(nèi)容,因此即使兩個錯誤文本相同2024-10-10

