濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > 在 Golang 中實(shí)現(xiàn)一個(gè)簡單的Http中間件過程詳解

在 Golang 中實(shí)現(xiàn)一個(gè)簡單的Http中間件過程詳解

熱門標(biāo)簽:如何利用高德地圖標(biāo)注家 電腦外呼系統(tǒng)輻射大嗎 揚(yáng)州電銷外呼系統(tǒng)軟件 上海企業(yè)外呼系統(tǒng)排名 400手機(jī)電話免費(fèi)辦理 開通400電話申請(qǐng)流程 智能語音電銷的機(jī)器人 百度地圖標(biāo)注位置網(wǎng)站 武漢百應(yīng)人工智能電銷機(jī)器人

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

首先, 我定義了三個(gè)測試的中間件 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.

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

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 接口上使用上面添加過中間件的 Pipeline

func main() {

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

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

	http.ListenAndServe(":8080", nil)

}

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

現(xiàn)在已經(jīng)實(shí)現(xiàn)了中間件的機(jī)制,但是,上面添加中間件是用嵌套的方法,這種方式不能說不太優(yōu)雅,只能說非常的Low,接下來我們需要對(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,用來接收添加到管道中的中間件,在 AddMiddlewares() 函數(shù)中,接收了多個(gè)Handle, 然后組裝到 Chain 對(duì)象并返回, 接下來調(diào)用 Then() 函數(shù), 把管道中的中間件和業(yè)務(wù)的Handler 關(guān)聯(lián)起來。在中間件的使用方式上, 這兩種方法都是一樣的,只需要調(diào)用 Pipeline() 方法就行了。

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

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

您可能感興趣的文章:
  • Golang 實(shí)現(xiàn)分片讀取http超大文件流和并發(fā)控制
  • 解決golang處理http response碰到的問題和需要注意的點(diǎn)
  • golang實(shí)現(xiàn)http server提供文件下載功能
  • Golang 發(fā)送http請(qǐng)求時(shí)設(shè)置header的實(shí)現(xiàn)
  • golang使用http client發(fā)起get和post請(qǐng)求示例
  • 一個(gè)簡單的Golang實(shí)現(xiàn)的HTTP Proxy方法

標(biāo)簽:宜賓 嘉峪關(guān) 延邊 張掖 武漢 新余 江西 黑龍江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在 Golang 中實(shí)現(xiàn)一個(gè)簡單的Http中間件過程詳解》,本文關(guān)鍵詞  在,Golang,中,實(shí)現(xiàn),一個(gè),簡單,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《在 Golang 中實(shí)現(xiàn)一個(gè)簡單的Http中間件過程詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于在 Golang 中實(shí)現(xiàn)一個(gè)簡單的Http中間件過程詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    登封市| 石泉县| 惠东县| 乐平市| 读书| 金秀| 云南省| 西昌市| 苏尼特右旗| 宣化县| 深泽县| 澎湖县| 扎兰屯市| 图片| 大宁县| 浏阳市| 抚顺市| 长阳| 河北区| 六枝特区| 海兴县| 澄迈县| 鹰潭市| 金川县| 南华县| 朝阳县| 丹东市| 沈丘县| 福州市| 樟树市| 贡嘎县| 嘉峪关市| 济阳县| 湘潭市| 贵阳市| 南开区| 武胜县| 巴彦淖尔市| 齐齐哈尔市| 应用必备| 潼关县|