好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 在 Golang 中實現一個簡單的Http中間件過程詳解

在 Golang 中實現一個簡單的Http中間件過程詳解

熱門標簽:如何利用高德地圖標注家 電腦外呼系統輻射大嗎 揚州電銷外呼系統軟件 上海企業外呼系統排名 400手機電話免費辦理 開通400電話申請流程 智能語音電銷的機器人 百度地圖標注位置網站 武漢百應人工智能電銷機器人

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

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

}

這里中間件的入參和出參的類型都是 http.Handler, 然后在 next.ServeHTTP() 的前后分別輸出了 In 和 Out.

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

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

	return Middleware1(Middleware2(Middleware3(next)))

}

然后還需要業務代碼,這里我定義了 LoginHandler 和 RegisterHandler 兩個方法

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

func main() {

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

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

	http.ListenAndServe(":8080", nil)

}

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

現在已經實現了中間件的機制,但是,上面添加中間件是用嵌套的方法,這種方式不能說不太優雅,只能說非常的Low,接下來我們需要對管道進行優化

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
} 

首先定義了一個Chain 的struct,用來接收添加到管道中的中間件,在 AddMiddlewares() 函數中,接收了多個Handle, 然后組裝到 Chain 對象并返回, 接下來調用 Then() 函數, 把管道中的中間件和業務的Handler 關聯起來。在中間件的使用方式上, 這兩種方法都是一樣的,只需要調用 Pipeline() 方法就行了。

本文在go web中簡單的實現了中間件的機制,這樣帶來的好處也是顯而易見的,當然社區也有一些成熟的 middleware 組件,包括 Gin 一些Web框架中也包含了 middleware 相關的功能, 希望對您有用.

到此這篇關于在 Golang 中實現一個簡單的Http中間件的文章就介紹到這了,更多相關Golang Http中間件內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

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

標簽:宜賓 嘉峪關 延邊 張掖 武漢 新余 江西 黑龍江

巨人網絡通訊聲明:本文標題《在 Golang 中實現一個簡單的Http中間件過程詳解》,本文關鍵詞  在,Golang,中,實現,一個,簡單,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《在 Golang 中實現一個簡單的Http中間件過程詳解》相關的同類信息!
  • 本頁收集關于在 Golang 中實現一個簡單的Http中間件過程詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 韩国激情老板秘书办公室| 健身房的少妇系列H高| 免费看男人吃奶摸捏奶头视频| 边啃奶头边躁狠狠躁玩爽日本| 羞羞影院爽爽影院免费下载 | 欧美bbw极品另类| 亚洲性一级理论片在线观看| 书包网扒开腿挺进肉蒂抽搐喷潮| 久久九九精品一区二区| 国产成人精品无缓存在线播放| 床震吃胸膜奶免费视频| 美女爆乳裸体啪啪久久精品网站| 99er热精品视频国产免费| 麻豆一二三区AV精品传媒软件| 成人在线综合| 日日爽日日操| 逼逼狗影院| 欧美国产午夜色爽爽| 三级黄网站| 老外国人一级A一片| 与老妇岳性疯狂刺激小说| 各国丰满肥妇毛茸茸| 波多野结衣被绝伦在线观看| 麻豆福利影院| 免费国产黄线在线观看软件| 别揉我的胸| 99热九九这里只有精品10| 成人做爰黄AA片免费看李晨视频 | 国产一区二区三区在线播放| 久久这里| 91麻豆精品国产91久久久久久久久 | 城中村精品无码视频在线观看 | 91麻豆国产视频| 亚洲综合色婷婷中文字幕| 国产15页| 明星系列短篇合集(21章)| 龚玥菲板金萍梅在线观看| 日本18xxxx| 韩国三级年轻护士完整版| chinesespanking视频| 精品国产福利|