您好,登錄后才能下訂單哦!
這篇“Golang Gin中間件Next()方法怎么使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Golang Gin中間件Next()方法怎么使用”文章吧。
在中間件中調用 next() 方法,會從 next() 方法調用的地方跳轉到
Handler函數Handler函數執行完成,若中間件還有部分代碼未執行(中間件中next()之后的代碼),則執行該代碼
如果第一個中間件處理直接使用了next函數,直接跳轉到handler函數,處理完之后還會回過來處理剩下的中間件函數。
除了最中心的這塊,其他的都是中間件,當我一個中間件進來,當我直接使用了next之后,直接跳到業務處理這部分的handler,然后業務處理的handler處理完畢之后,然后它再回跳到一層一層未處理完的這個中間件代碼。
所以它就非常像洋蔥,它其實中間件是一層一層,但是前面只執行了一半,處理完中間件之后是響應了,響應的時候還會再去處理剩下的這個中間件一層一層。
// 日志中間件 func MiddleWareLog() gin.HandlerFunc { //這里也是context,因為你的中間件也是對請求和響應的處理,只要涉及到請求和響應的處理就用到context上下文 return func(c *gin.Context) { fmt.Println("log start") c.Next() fmt.Println("log end") } } func MiddleWareRequestId() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("request id start") c.Next() fmt.Println("request id end") } } func main() { r := gin.Default() r.Use(MiddleWareLog(), MiddleWareRequestId()) r.GET("/", func(c *gin.Context) { fmt.Println("app handler.......") c.JSON(http.StatusOK, gin.H{ "msg": "success", }) }) r.Run(":8000") }
[GIN-debug] Listening and serving HTTP on :8000 log start request id start app handler....... request id end log end [GIN] 2023/04/08 - 09:51:03 | 200 | 2.2505ms | ::1 | GET "/"
首先可以看到我先注冊了log中間件,然后注冊了requestid中間件的id。所以說是按照注冊中間件的順序來的,然后會執行完。
(1)如果上面中間件沒有加入next函數,那么它會將中間件里面所有邏輯執行完
(2)如果只有一層中間件,那么在中間件中調用 next() 方法,會從 next() 方法調用的地方跳轉到Handler函數。
如果有多層中間件,那么會跳轉到鏈表里面下一個中間件,上面就是從log中間件跳轉到request中間件了。在requestid中間件執行了next函數,它下面沒有中間件了,只有業務代碼了,那么就去執行業務的handler,并且執行好了之后我返回出去,最后執行剩下的中間件那部分沒執行完的邏輯。
其實和洋蔥一樣,最開始執行的是最外面的一層,后執行的是最里面的一層。但是業務代碼執行完了之后,我從最里面這層開始
業務場景:最里面這一層的中間件,就是requestid了,可以去做一個開始的計時,next()然后里面去執行業務代碼,執行完之后返回里面再來一個結束的計時,那么就能夠拿到這個方法的執行時間。
在寫一些微服務框架,做一個metric的展現的時候,其實都是借助中間件這么做的,然后將數據暴露給一個接口,然后Prometheus去拿一下,最后展現出來,就是這樣實現的。
http://127.0.0.1:8080/index index首頁無需token直接訪問
http://127.0.0.1:8080/home home家目錄需要對token進行驗證,驗證通過才可訪問
中間件最大的存儲長度是60多,不能再往下存了。
c.abort()就是直接跳到鏈表最后一個, 后面沒有了,那么也就執行完了,其他的中間件就不執行了。
package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) func AuthMiddleWare() gin.HandlerFunc { return func(c *gin.Context) { //常用場景,客戶端也就是接口的調用方,客戶端攜帶token的方式 1:請求頭(最常用) 2:請求體 3:uri token := c.Request.Header.Get("token") fmt.Println("獲取token信息:", token) if token != "qazw1234" { c.JSON(http.StatusOK, gin.H{ "msg": "身份驗證不通過", }) //Abort方法用于跳到handler鏈表最后一個index,相當于直接退出,不執行后面的handler了 c.Abort() return } } } func main() { r := gin.Default() r.GET("/home", AuthMiddleWare(), func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "msg": "home路由", }) }) r.Run(":8000") }
以上就是關于“Golang Gin中間件Next()方法怎么使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。