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

Golang中實(shí)現(xiàn)簡(jiǎn)單的Http Middleware

 更新時(shí)間:2021年07月29日 10:08:36   作者:SpringLeee  
本文主要針對(duì)Golang的內(nèi)置庫(kù) net/http 做了簡(jiǎn)單的擴(kuò)展,實(shí)現(xiàn)簡(jiǎn)單的Http Middleware,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文主要針對(duì)Golang的內(nèi)置庫(kù) net/http 做了簡(jiǎn)單的擴(kuò)展,通過(guò)添加中間件的形式實(shí)現(xiàn)了管道(Pipeline)模式,這樣的好處是各模塊之間是低耦合的,符合單一職責(zé)原則,可以很靈活的通過(guò)中間件的形式添加一些功能到管道中,一次請(qǐng)求和響應(yīng)在管道中的執(zhí)行過(guò)程如下

首先, 我定義了三個(gè)測(cè)試的中間件 Middleware1,2,3 如下

func Middleware1(next http.Handler) http.Handler {

	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Println("M1 in")
		next.ServeHTTP(w, r)
		fmt.Println("M1 out")
	})

}

func Middleware2(next http.Handler) http.Handler {

	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Println("M2 in")
		next.ServeHTTP(w, r)
		fmt.Println("M2 out")
	})

}

func Middleware3(next http.Handler) http.Handler {

	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Println("M3 in")
		next.ServeHTTP(w, r)
		fmt.Println("M3 out")
	})

}

這里中間件的入?yún)⒑统鰠⒌念愋投际?http.Handler, 然后在 next.ServeHTTP() 的前后分別輸出了 In 和 Out.

接下來(lái),定義一個(gè) Pipeline 的方法,里面使用嵌套的形式, 使用了上面定義的三個(gè)測(cè)試的中間件.

func Pipeline(next http.Handler) http.Handler {

	return Middleware1(Middleware2(Middleware3(next)))

}

然后還需要業(yè)務(wù)代碼,這里我定義了 LoginHandler 和 RegisterHandler 兩個(gè)方法

func LoginHandler(w http.ResponseWriter, r *http.Request) {

	fmt.Println("Login...")
	w.Write([]byte("Login..."))

}

func RegisterHandler(w http.ResponseWriter, r *http.Request) {

	fmt.Println("Register...")
	w.Write([]byte("Register..."))

}

最后修改程序的 main 函數(shù), 在 Login 接口上使用上面添加過(guò)中間件的 Pipeline

func main() {

	http.Handle("/Login", Pipeline(http.HandlerFunc(LoginHandler)))

	http.Handle("/Register", http.HandlerFunc(RegisterHandler))

	http.ListenAndServe(":8080", nil)

}

啟動(dòng)程序后,訪問(wèn) http://localhost:8080/Login, 程序的輸出如下,這和本文最上面的管道的流程圖是一致的,然后訪問(wèn) Register 接口, 控制臺(tái)沒(méi)有輸出信息,當(dāng)然也不會(huì)執(zhí)行任何中間件。

現(xiàn)在已經(jīng)實(shí)現(xiàn)了中間件的機(jī)制,但是,上面添加中間件是用嵌套的方法,這種方式不能說(shuō)不太優(yōu)雅,只能說(shuō)非常的Low,接下來(lái)我們需要對(duì)管道進(jìn)行優(yōu)化

type Chain struct {
	middlewares []func(handler http.Handler) http.Handler
}


func Pipeline(next http.Handler) http.Handler {

	//return Middleware1(Middleware2(Middleware3(next)))

	return AddMiddlewares(Middleware1,Middleware2,Middleware3).Then(next)

} 


func AddMiddlewares(m ...func(handlerFunc http.Handler) http.Handler) Chain {

	c := Chain{}

	c.middlewares = append(c.middlewares,m...)

	return c

}


func (c Chain) Then(next http.Handler) http.Handler {

	for i := range c.middlewares {

		prev := c.middlewares[len(c.middlewares)-1-i]

		next = prev(next)
	}

	return next
} 

首先定義了一個(gè)Chain 的struct,用來(lái)接收添加到管道中的中間件,在 AddMiddlewares() 函數(shù)中,接收了多個(gè)Handle, 然后組裝到 Chain 對(duì)象并返回, 接下來(lái)調(diào)用 Then() 函數(shù), 把管道中的中間件和業(yè)務(wù)的Handler 關(guān)聯(lián)起來(lái)。在中間件的使用方式上, 這兩種方法都是一樣的,只需要調(diào)用 Pipeline() 方法就行了。

本文在go web中簡(jiǎn)單的實(shí)現(xiàn)了中間件的機(jī)制,這樣帶來(lái)的好處也是顯而易見(jiàn)的,當(dāng)然社區(qū)也有一些成熟的 middleware 組件,包括 Gin 一些Web框架中也包含了 middleware 相關(guān)的功能, 希望對(duì)您有用.

到此這篇關(guān)于Golang中實(shí)現(xiàn)簡(jiǎn)單的Http Middleware的文章就介紹到這了,更多相關(guān)Golang實(shí)現(xiàn)Http Middleware內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go標(biāo)準(zhǔn)庫(kù)Flag庫(kù)和Log庫(kù)的使用

    Go標(biāo)準(zhǔn)庫(kù)Flag庫(kù)和Log庫(kù)的使用

    本文主要介紹了Go標(biāo)準(zhǔn)庫(kù)Flag庫(kù)和Log庫(kù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • GO中的條件變量sync.Cond詳解

    GO中的條件變量sync.Cond詳解

    條件變量是基于互斥鎖的,它必須基于互斥鎖才能發(fā)揮作用,條件變量的初始化離不開(kāi)互斥鎖,并且它的方法有點(diǎn)也是基于互斥鎖的,這篇文章主要介紹了GO的條件變量sync.Cond,需要的朋友可以參考下
    2023-01-01
  • golang-切片slice的創(chuàng)建方式

    golang-切片slice的創(chuàng)建方式

    這篇文章主要介紹了golang-切片slice的創(chuàng)建方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 如何判斷Golang接口是否實(shí)現(xiàn)的操作

    如何判斷Golang接口是否實(shí)現(xiàn)的操作

    這篇文章主要介紹了如何判斷Golang接口是否實(shí)現(xiàn)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Golang并發(fā)編程之調(diào)度器初始化詳解

    Golang并發(fā)編程之調(diào)度器初始化詳解

    這篇文章主要為大家詳細(xì)介紹了Golang并發(fā)編程中關(guān)于調(diào)度器初始化的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-03-03
  • GO語(yǔ)言獲取系統(tǒng)環(huán)境變量的方法

    GO語(yǔ)言獲取系統(tǒng)環(huán)境變量的方法

    這篇文章主要介紹了GO語(yǔ)言獲取系統(tǒng)環(huán)境變量的方法,實(shí)例分析了Getenv方法操作環(huán)境變量的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • go語(yǔ)言題解LeetCode506相對(duì)名次示例詳解

    go語(yǔ)言題解LeetCode506相對(duì)名次示例詳解

    這篇文章主要為大家介紹了go語(yǔ)言題解LeetCode506相對(duì)名次示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go json omitempty如何實(shí)現(xiàn)可選屬性

    Go json omitempty如何實(shí)現(xiàn)可選屬性

    在Go語(yǔ)言中,使用`omitempty`可以幫助我們?cè)谶M(jìn)行JSON序列化和反序列化時(shí),忽略結(jié)構(gòu)體中的零值或空值,本文介紹了如何通過(guò)將字段類型改為指針類型,并在結(jié)構(gòu)體的JSON標(biāo)簽中添加`omitempty`來(lái)實(shí)現(xiàn)這一功能,例如,將float32修改為*float32
    2024-09-09
  • Go語(yǔ)言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞詳解

    Go語(yǔ)言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞詳解

    這篇文章主要介紹了Go語(yǔ)言中init函數(shù)和defer延遲調(diào)用關(guān)鍵詞,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • go語(yǔ)言中如何使用select的實(shí)現(xiàn)示例

    go語(yǔ)言中如何使用select的實(shí)現(xiàn)示例

    本文主要介紹了go語(yǔ)言中如何使用select的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評(píng)論