欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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í)大部分使用場(chǎng)景都是使用全局中間件。

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

相關(guān)文章

  • Golang環(huán)境變量設(shè)置和查看工具go env詳解

    Golang環(huán)境變量設(shè)置和查看工具go env詳解

    go env 是 Go 工具鏈中的一個(gè)命令,用于設(shè)置和查看當(dāng)前 Golang 環(huán)境的相關(guān)信息,對(duì)于理解、編譯和運(yùn)行 Golang 程序非常有用,本文就給大家簡(jiǎn)單的介紹一下Golang環(huán)境變量設(shè)置和查看工具go env,需要的朋友可以參考下
    2023-07-07
  • victoriaMetrics庫布隆過濾器初始化及使用詳解

    victoriaMetrics庫布隆過濾器初始化及使用詳解

    這篇文章主要為大家介紹了victoriaMetrics庫布隆過濾器初始化及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • go slice不同初始化方式性能及數(shù)組比較詳解

    go slice不同初始化方式性能及數(shù)組比較詳解

    這篇文章主要為大家介紹了go slice不同初始化方式性能及數(shù)組比較示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • golang?基于?mysql?簡(jiǎn)單實(shí)現(xiàn)分布式讀寫鎖

    golang?基于?mysql?簡(jiǎn)單實(shí)現(xiàn)分布式讀寫鎖

    這篇文章主要介紹了golang?基于mysql簡(jiǎn)單實(shí)現(xiàn)分布式讀寫鎖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解

    Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解

    這篇文章主要為大家介紹了Golang基礎(chǔ)之函數(shù)使用(參數(shù)傳值)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • go select的用法

    go select的用法

    本文主要介紹了go select的用法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Go語言interface詳解

    Go語言interface詳解

    這篇文章主要介紹了Go語言interface詳解,本文講解了什么是interface、interface類型、interface值、空interface、interface函數(shù)參數(shù)等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Golang獲取當(dāng)前時(shí)間代碼

    Golang獲取當(dāng)前時(shí)間代碼

    本文給大家匯總介紹了golang中的相關(guān)的時(shí)間的操作,有需要的小伙伴可以拿走參考下
    2018-10-10
  • Golang?手寫一個(gè)簡(jiǎn)單的并發(fā)任務(wù)?manager

    Golang?手寫一個(gè)簡(jiǎn)單的并發(fā)任務(wù)?manager

    這篇文章主要介紹了Golang?手寫一個(gè)簡(jiǎn)單的并發(fā)任務(wù)?manager,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • 深入理解Go語言中的閉包

    深入理解Go語言中的閉包

    Go函數(shù)是可以閉包的。閉包是一個(gè)函數(shù)值,他來自函數(shù)體外部的變量引用。 下面這篇文章通過一個(gè)demo來進(jìn)行深入的介紹了Go語言中閉包的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-03-03

最新評(píng)論