最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang?Gin?中間件?Next()方法示例詳解

 更新時(shí)間:2023年04月10日 14:41:12   作者:富士康質(zhì)檢員張全蛋  
這篇文章主要介紹了Golang?Gin?中間件?Next()方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Next()方法

  • 在中間件中調(diào)用 next() 方法,會(huì)從 next() 方法調(diào)用的地方跳轉(zhuǎn)到
  • Handler函數(shù)Handler函數(shù)執(zhí)行完成,若中間件還有部分代碼未執(zhí)行(中間件中next()之后的代碼),則執(zhí)行該代碼

如果第一個(gè)中間件處理直接使用了next函數(shù),直接跳轉(zhuǎn)到handler函數(shù),處理完之后還會(huì)回過(guò)來(lái)處理剩下的中間件函數(shù)。

除了最中心的這塊,其他的都是中間件,當(dāng)我一個(gè)中間件進(jìn)來(lái),當(dāng)我直接使用了next之后,直接跳到業(yè)務(wù)處理這部分的handler,然后業(yè)務(wù)處理的handler處理完畢之后,然后它再回跳到一層一層未處理完的這個(gè)中間件代碼。

所以它就非常像洋蔥,它其實(shí)中間件是一層一層,但是前面只執(zhí)行了一半,處理完中間件之后是響應(yīng)了,響應(yīng)的時(shí)候還會(huì)再去處理剩下的這個(gè)中間件一層一層。

// 日志中間件
func MiddleWareLog() gin.HandlerFunc {
	//這里也是context,因?yàn)槟愕闹虚g件也是對(duì)請(qǐng)求和響應(yīng)的處理,只要涉及到請(qǐng)求和響應(yīng)的處理就用到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      "/"

首先可以看到我先注冊(cè)了log中間件,然后注冊(cè)了requestid中間件的id。所以說(shuō)是按照注冊(cè)中間件的順序來(lái)的,然后會(huì)執(zhí)行完。

(1)如果上面中間件沒有加入next函數(shù),那么它會(huì)將中間件里面所有邏輯執(zhí)行完

(2)如果只有一層中間件,那么在中間件中調(diào)用 next() 方法,會(huì)從 next() 方法調(diào)用的地方跳轉(zhuǎn)到Handler函數(shù)。

如果有多層中間件,那么會(huì)跳轉(zhuǎn)到鏈表里面下一個(gè)中間件,上面就是從log中間件跳轉(zhuǎn)到request中間件了。在requestid中間件執(zhí)行了next函數(shù),它下面沒有中間件了,只有業(yè)務(wù)代碼了,那么就去執(zhí)行業(yè)務(wù)的handler,并且執(zhí)行好了之后我返回出去,最后執(zhí)行剩下的中間件那部分沒執(zhí)行完的邏輯。

其實(shí)和洋蔥一樣,最開始執(zhí)行的是最外面的一層,后執(zhí)行的是最里面的一層。但是業(yè)務(wù)代碼執(zhí)行完了之后,我從最里面這層開始

業(yè)務(wù)場(chǎng)景:最里面這一層的中間件,就是requestid了,可以去做一個(gè)開始的計(jì)時(shí),next()然后里面去執(zhí)行業(yè)務(wù)代碼,執(zhí)行完之后返回里面再來(lái)一個(gè)結(jié)束的計(jì)時(shí),那么就能夠拿到這個(gè)方法的執(zhí)行時(shí)間。

在寫一些微服務(wù)框架,做一個(gè)metric的展現(xiàn)的時(shí)候,其實(shí)都是借助中間件這么做的,然后將數(shù)據(jù)暴露給一個(gè)接口,然后Prometheus去拿一下,最后展現(xiàn)出來(lái),就是這樣實(shí)現(xiàn)的。

實(shí)現(xiàn)token認(rèn)證

http://127.0.0.1:8080/index index首頁(yè)無(wú)需token直接訪問

http://127.0.0.1:8080/home home家目錄需要對(duì)token進(jìn)行驗(yàn)證,驗(yàn)證通過(guò)才可訪問

中間件最大的存儲(chǔ)長(zhǎng)度是60多,不能再往下存了。

c.abort()就是直接跳到鏈表最后一個(gè), 后面沒有了,那么也就執(zhí)行完了,其他的中間件就不執(zhí)行了。

package main
 
import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)
 
func AuthMiddleWare() gin.HandlerFunc {
	return func(c *gin.Context) {
		//常用場(chǎng)景,客戶端也就是接口的調(diào)用方,客戶端攜帶token的方式 1:請(qǐng)求頭(最常用) 2:請(qǐng)求體 3:uri
		token := c.Request.Header.Get("token")
		fmt.Println("獲取token信息:", token)
 
		if token != "qazw1234" {
			c.JSON(http.StatusOK, gin.H{
				"msg": "身份驗(yàn)證不通過(guò)",
			})
			//Abort方法用于跳到handler鏈表最后一個(gè)index,相當(dāng)于直接退出,不執(zhí)行后面的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")
}

到此這篇關(guān)于Golang Gin 中間件 Next()方法的文章就介紹到這了,更多相關(guān)Golang Gin 中間件 Next內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語(yǔ)言LeetCode題解720詞典中最長(zhǎng)的單詞

    go語(yǔ)言LeetCode題解720詞典中最長(zhǎng)的單詞

    這篇文章主要為大家介紹了go語(yǔ)言LeetCode題解720詞典中最長(zhǎng)的單詞,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go使用database/sql操作數(shù)據(jù)庫(kù)的教程指南

    Go使用database/sql操作數(shù)據(jù)庫(kù)的教程指南

    Go?語(yǔ)言中,有一個(gè)名為database/sql的標(biāo)準(zhǔn)庫(kù),提供了統(tǒng)一的編程接口,使開發(fā)人員能夠以一種通用的方式與各種關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行交互,本文就來(lái)和大家講講它的具體操作吧
    2023-06-06
  • Go使用proto3的踩坑實(shí)戰(zhàn)記錄

    Go使用proto3的踩坑實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于Go使用proto3的踩坑記錄,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者會(huì)用Go語(yǔ)言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 掌握GoLang Fiber路由和中間件技術(shù)進(jìn)行高效Web開發(fā)

    掌握GoLang Fiber路由和中間件技術(shù)進(jìn)行高效Web開發(fā)

    這篇文章主要為大家介紹了GoLang Fiber路由和中間件進(jìn)行高效Web開發(fā),本文將深入探討 Fiber 中的路由細(xì)節(jié),學(xué)習(xí)如何創(chuàng)建和處理路由,深入了解使用路由參數(shù)的動(dòng)態(tài)路由,并掌握在 Fiber 應(yīng)用程序中實(shí)現(xiàn)中間件的藝術(shù)
    2024-01-01
  • go語(yǔ)言實(shí)現(xiàn)將重要數(shù)據(jù)寫入圖片中

    go語(yǔ)言實(shí)現(xiàn)將重要數(shù)據(jù)寫入圖片中

    本文給大家分享的是go語(yǔ)言實(shí)現(xiàn)將數(shù)據(jù)的二進(jìn)制形式寫入圖像紅色通道數(shù)據(jù)二進(jìn)制的低位,從而實(shí)現(xiàn)將重要數(shù)據(jù)隱藏,有需要的小伙伴參考下吧。
    2015-03-03
  • Go實(shí)現(xiàn)map轉(zhuǎn)json的示例詳解

    Go實(shí)現(xiàn)map轉(zhuǎn)json的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語(yǔ)言實(shí)現(xiàn)map轉(zhuǎn)json的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • go解析YAML文件(多文檔解析)

    go解析YAML文件(多文檔解析)

    本文介紹了如何使用GO語(yǔ)言和client-go庫(kù)處理YAML文件,特別是在Kubernetes環(huán)境下,分析了YAML的特點(diǎn),如簡(jiǎn)潔性、易讀性、可嵌套性等,并展示了相關(guān)代碼實(shí)現(xiàn),包括單文檔和多文檔的處理方法,感興趣的可以了解一下
    2024-10-10
  • Golang實(shí)現(xiàn)簡(jiǎn)單http服務(wù)器的示例詳解

    Golang實(shí)現(xiàn)簡(jiǎn)單http服務(wù)器的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Golang實(shí)現(xiàn)簡(jiǎn)單http服務(wù)器,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Golang有一定的幫助,需要的可以參考一下
    2023-03-03
  • golang中http請(qǐng)求的context傳遞到異步任務(wù)的坑及解決

    golang中http請(qǐng)求的context傳遞到異步任務(wù)的坑及解決

    這篇文章主要介紹了golang中http請(qǐng)求的context傳遞到異步任務(wù)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以)

    Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以)

    這篇文章主要介紹了Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以),本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論

汉中市| 镇宁| 凌海市| 江口县| 宁夏| 利川市| 乌拉特后旗| 敦煌市| 平山县| 福海县| 凉城县| 新闻| 寿阳县| 榆林市| 汝阳县| 北宁市| 宁蒗| 崇阳县| 安平县| 奉节县| 宝丰县| 澄江县| 明溪县| 贵南县| 巩义市| 留坝县| 左权县| 五寨县| 乌兰察布市| 和静县| 驻马店市| 搜索| 建德市| 梅州市| 博乐市| 石家庄市| 怀化市| 云阳县| 万山特区| 伊吾县| 达日县|