91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang?Gin中間件Next()方法怎么使用

發布時間:2023-04-10 15:53:14 來源:億速云 閱讀:110 作者:iii 欄目:開發技術

這篇“Golang Gin中間件Next()方法怎么使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Golang Gin中間件Next()方法怎么使用”文章吧。

Next()方法

  • 在中間件中調用 next() 方法,會從 next() 方法調用的地方跳轉到

  • Handler函數Handler函數執行完成,若中間件還有部分代碼未執行(中間件中next()之后的代碼),則執行該代碼

Golang?Gin中間件Next()方法怎么使用

如果第一個中間件處理直接使用了next函數,直接跳轉到handler函數,處理完之后還會回過來處理剩下的中間件函數。

Golang?Gin中間件Next()方法怎么使用

除了最中心的這塊,其他的都是中間件,當我一個中間件進來,當我直接使用了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")
}

Golang?Gin中間件Next()方法怎么使用

[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去拿一下,最后展現出來,就是這樣實現的。

實現token認證

http://127.0.0.1:8080/index index首頁無需token直接訪問

http://127.0.0.1:8080/home home家目錄需要對token進行驗證,驗證通過才可訪問

Golang?Gin中間件Next()方法怎么使用

中間件最大的存儲長度是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()方法怎么使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲阳县| 烟台市| 文成县| 神农架林区| 青州市| 资兴市| 赤水市| 岑溪市| 清水河县| 博乐市| 辽源市| 景东| 鹤壁市| 辛集市| 桐城市| 柳河县| 灵川县| 富顺县| 金昌市| 云南省| 和田市| 乃东县| 桃园市| 武邑县| 行唐县| 探索| 和静县| 象州县| 屯昌县| 普宁市| 奉新县| 包头市| 错那县| 广昌县| 万全县| 阿克苏市| 榆林市| 太仓市| 龙胜| 丰县| 德保县|