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

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

 更新時(shí)間:2023年04月27日 10:32:02   作者:富士康質(zhì)檢員張全蛋  
中間件是放在客戶端和服務(wù)端的中間,當(dāng)你的客戶端對(duì)某個(gè)接口發(fā)起一個(gè)請(qǐng)求,但是在到達(dá)接口2之前,這里是有一層中間件的處理。本文詳細(xì)介紹了Golang Gin局部、全局中間件使用方法,感興趣的同學(xué)可以閱讀本文

中間件

中間件是放在客戶端和服務(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ù)分頁、記錄日志、耗時(shí)統(tǒng)計(jì)等(比如微服務(wù)架構(gòu),你要去統(tǒng)計(jì)每個(gè)服務(wù)的metrics,比如請(qǐng)求的耗時(shí),請(qǐng)求的狀態(tài)碼,也可以通過這個(gè)中間件去實(shí)現(xiàn))

1. 全局中間件  

全局中間件對(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í)行的。

2. 局部中間件

局部中間件就是對(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àn)證 
    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í)行了這個(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í)大部分使用場景都是使用全局中間件。

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

相關(guān)文章

  • golang讀取文件的常用方法總結(jié)

    golang讀取文件的常用方法總結(jié)

    今天小編就為大家分享一篇關(guān)于golang讀取文件的常用方法總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • GoLang RabbitMQ實(shí)現(xiàn)六種工作模式示例

    GoLang RabbitMQ實(shí)現(xiàn)六種工作模式示例

    這篇文章主要介紹了GoLang RabbitMQ實(shí)現(xiàn)六種工作模式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • golang接收post和get請(qǐng)求參數(shù)處理

    golang接收post和get請(qǐng)求參數(shù)處理

    本文主要介紹了golang接收post和get請(qǐng)求參數(shù)處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang并發(fā)執(zhí)行的幾種方式小結(jié)

    golang并發(fā)執(zhí)行的幾種方式小結(jié)

    本文主要介紹了golang并發(fā)執(zhí)行的幾種方式小結(jié),主要包括了Channel,WaitGroup ,Context,使用這三種機(jī)制中的一種或者多種可以達(dá)到并發(fā)控制很好的效果,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Golang編程實(shí)現(xiàn)生成n個(gè)從a到b不重復(fù)隨機(jī)數(shù)的方法

    Golang編程實(shí)現(xiàn)生成n個(gè)從a到b不重復(fù)隨機(jī)數(shù)的方法

    這篇文章主要介紹了Golang編程實(shí)現(xiàn)生成n個(gè)從a到b不重復(fù)隨機(jī)數(shù)的方法,結(jié)合實(shí)例形式分析了Go語言字符串操作及隨機(jī)數(shù)生成的相關(guān)操作技巧,需要的朋友可以參考下
    2017-01-01
  • Go計(jì)時(shí)器的示例代碼

    Go計(jì)時(shí)器的示例代碼

    定時(shí)器是任何編程語言的重要工具,它允許開發(fā)人員在特定時(shí)間間隔安排任務(wù)或執(zhí)行代碼,本文主要介紹了Go計(jì)時(shí)器的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • go slice 數(shù)組和切片使用區(qū)別示例解析

    go slice 數(shù)組和切片使用區(qū)別示例解析

    這篇文章主要為大家介紹了go slice 數(shù)組和切片使用區(qū)別示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • GO的基礎(chǔ)知識(shí)掃盲注意事項(xiàng)

    GO的基礎(chǔ)知識(shí)掃盲注意事項(xiàng)

    這篇文章主要介紹了GO的基礎(chǔ)知識(shí)注意事項(xiàng),本文是GO語言小白的掃盲文,主要講解了go語言的基本知識(shí),GO程序目錄結(jié)構(gòu),GO程序包的導(dǎo)入與別名運(yùn)用,GO內(nèi)置關(guān)鍵字,GO注釋方法需要的朋友可以參考下
    2022-12-12
  • GO 使用Webhook 實(shí)現(xiàn)github 自動(dòng)化部署的方法

    GO 使用Webhook 實(shí)現(xiàn)github 自動(dòng)化部署的方法

    這篇文章主要介紹了GO 使用Webhook 實(shí)現(xiàn)github 自動(dòng)化部署的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Golang標(biāo)準(zhǔn)庫之errors包應(yīng)用方式

    Golang標(biāo)準(zhǔn)庫之errors包應(yīng)用方式

    Go語言的errors包提供了基礎(chǔ)的錯(cuò)誤處理能力,允許通過errors.New創(chuàng)建自定義error對(duì)象,error在Go中是一個(gè)接口,通過實(shí)現(xiàn)Error方法來定義錯(cuò)誤文本,對(duì)錯(cuò)誤的比較通?;趯?duì)象地址,而非文本內(nèi)容,因此即使兩個(gè)錯(cuò)誤文本相同
    2024-10-10

最新評(píng)論

左权县| 密云县| 葵青区| 潍坊市| 临泉县| 夹江县| 阿拉善左旗| 兴仁县| 兴山县| 都安| 内黄县| 平湖市| 延吉市| 格尔木市| 堆龙德庆县| 丽江市| 姜堰市| 上栗县| 阿坝县| 同仁县| 龙南县| 阜城县| 江西省| 万安县| 高州市| 新巴尔虎左旗| 清徐县| 东丰县| 页游| 慈溪市| 苏尼特右旗| 休宁县| 介休市| 专栏| 革吉县| 尖扎县| 靖远县| 土默特左旗| 秀山| 美姑县| 平武县|