婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 如何編寫Go語言中間件的實例教程

如何編寫Go語言中間件的實例教程

熱門標簽:鄭州亮點科技用的什么外呼系統 阿里云ai電話機器人 釘釘有地圖標注功能嗎 浙江高頻外呼系統多少錢一個月 濱州自動電銷機器人排名 建造者2地圖標注 黃岡人工智能電銷機器人哪個好 惠州電銷防封電話卡 汕頭小型外呼系統

引言

web開發的背景下,“中間件”通常意思是“包裝原始應用并添加一些額外的功能的應用的一部分”。這個概念似乎總是不被人理解,但是我認為中間件非常棒。

首先,一個好的中間件有一個責任就是可插拔并且自足。這就意味著你可以在接口級別嵌入你的中間件他就能直接運行。它不會影響你編碼方式,不是框架,僅僅是你請求處理里面的一層而已。完全沒必要重寫你的代碼,如果你想使用中間件的一個功能,你就幫他插入到那里,如果不想使用了,就可以直接移除。

縱觀Go語言,中間件是非常普遍的,即使在標準庫中。雖然開始的時候不會那么明顯,在標準庫net/http中的函數StripText或者TimeoutHandler就是我們要定義和的中間件的樣子,處理請求和相應的時候他們包裝你的handler,并處理一些額外的步驟。

一開始,我們認為編寫中間件似乎很容易,但是我們實際編寫的時候也會遇到各種各樣的坑。讓我們來看看一些例子。

1、讀取請求

在我們的示例中,所有的中間件都將接受http。處理程序作為一個參數,并返回一個http.Handler。這使得人們很容易就能把中間產品串起來。我們所有的中間產品的基本模式是這樣的:

func X(h http.Handler) http.Handler {
 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 // Something here...
 h.ServeHTTP(w, r)
 })
}

我們想要將所有的請求重定向到一個斜杠——比方說/message/,到它們的非斜杠等效,比如/message。我們可以這樣寫:

func TrailingSlashRedirect(h http.Handler) http.Handler {
 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 if r.URL.Path != "/"  r.URL.Path[len(r.URL.Path)-1] == '/' {
 http.Redirect(w, r, r.URL.Path[:len(r.URL.Path)-1], http.StatusMovedPermanently)
 return
 }
 h.ServeHTTP(w, r)
 })
}

有沒有很簡單。

2、修改請求

比方說,我們想要向請求添加一個標題,或者修改它。http.Handler文檔中指明:

除了讀取主體之外,處理程序不應該修改所提供的請求。

Go標準庫復制http.Request。請求對象在將其傳遞到響應鏈之前,我們也應該這樣做。假設我們想在每個請求上設置Request-Id頭,以便內部跟蹤。創建*Request的淺副本,并在代理之前修改標題。

func RequestID(h http.Handler) http.Handler {
 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 r2 := new(http.Request)
 *r2 = *r
 r2.Header.Set("X-Request-Id", uuid.NewV4().String())
 h.ServeHTTP(w, r2)
 })
}

3、編寫響應頭

如果你想設置響應頭,你可以只寫它們,然后代理請求。

func Server(h http.Handler, servername string) http.Handler {
 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 w.Header().Set("Server", servername)
 h.ServeHTTP(w, r)
 })
}

上面的問題是,如果內部處理器也設置了服務器頭,那么你的頭將被覆蓋。如果不想公開內部軟件的服務器頭,或者如果想在發送響應給客戶端之前去掉頭部,這可能會帶來問題。

要做到這一點,我們必須自己實現ResponseWriter接口。大多數時候,我們只會代理到底層的ResponseWriter,但是如果用戶試圖寫一個響應,我們就會潛入并添加我們的標題。

type serverWriter struct {
 w http.ResponseWriter
 name string
 wroteHeaders bool
}

func (s *serverWriter) Header() http.Header {
 return s.w.Header()
}

func (s *serverWriter) WriteHeader(code int) http.Header {
 if s.wroteHeader == false {
 s.w.Header().Set("Server", s.name)
 s.wroteHeader = true
 }
 s.w.WriteHeader(code)
}

func (s *serverWriter) Write(b []byte) (int, error) {
 if s.wroteHeader == false {
 // We hit this case if user never calls WriteHeader (default 200)
 s.w.Header().Set("Server", s.name)
 s.wroteHeader = true
 } return s.w.Write(b)
}

要在我們的中間件中使用它,我們會寫:

func Server(h http.Handler, servername string) http.Handler {
 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 sw := serverWriter{
 w: w,
 name: servername,
 }
 h.ServeHTTP(sw, r)
 })
}

問題

如果用戶從不調用Write或WriteHeader呢?例如,有一個200狀態并且是空body,或者對選項請求的響應——我們的攔截函數都不會運行。因此,我們應該在ServeHTTP調用之后再添加校驗。

func Server(h http.Handler, servername string) http.Handler {
 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 sw := serverWriter{
 w: w,
 name: servername,
 }
 h.ServeHTTP(sw, r)
 if sw.wroteHeaders == false {
 s.w.Header().Set("Server", s.name)
 s.wroteHeader = true
 }
 })
}

其他ResponseWriter接口

ResponseWriter接口只需要有三種方法。但在實踐中,它也可以對其他接口作出響應,例如http.Pusher。你的中間件可能會意外地禁用HTTP/2支持,這是不好的。

// Push implements the http.Pusher interface.
func (s *serverWriter) Push(target string, opts *http.PushOptions) error {
 if pusher, ok := s.w.(http.Pusher); ok {
 return pusher.Push(target, opts)
 }
 return http.ErrNotSupported
}

// Flush implements the http.Flusher interface.
func (s *serverWriter) Flush() {
 f, ok := s.w.(http.Flusher)
 if ok {
 f.Flush()
 }
}

總結

通過以上的學習,不知道大家對Go編寫中間件有沒有一個完整的認識。大家也可以嘗試著用Go去編寫一個中間件。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

標簽:晉中 滄州 昭通 駐馬店 東營 阿壩 瀘州 泰安

巨人網絡通訊聲明:本文標題《如何編寫Go語言中間件的實例教程》,本文關鍵詞  如何,編寫,語言,中間件,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《如何編寫Go語言中間件的實例教程》相關的同類信息!
  • 本頁收集關于如何編寫Go語言中間件的實例教程的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美一区二区三区播放老司机| 国产成人超碰人人澡人人澡| 视频一区在线播放| 欧美一区二区视频在线观看| 亚洲成av人片观看| 欧美伦理影视网| 亚洲综合丁香婷婷六月香| 色综合色狠狠综合色| 亚洲视频精选在线| 精品视频免费在线| 男人的j进女人的j一区| 国产黄色精品视频| 奇米精品一区二区三区在线观看| 一区二区三区欧美久久| 欧美私人免费视频| 日日噜噜夜夜狠狠视频欧美人 | 成人动漫一区二区| 国产精品高潮呻吟久久| 色综合色狠狠天天综合色| 视频精品一区二区| 国产精品久久毛片a| 91麻豆123| 麻豆视频观看网址久久| 欧美激情一区二区三区蜜桃视频| 91丨porny丨蝌蚪视频| 午夜精品久久久久久久99水蜜桃| 精品久久人人做人人爽| av午夜一区麻豆| 蜜乳av一区二区三区| 日韩一区欧美小说| 精品美女被调教视频大全网站| 成人av中文字幕| 日本成人超碰在线观看| 最新不卡av在线| 精品美女一区二区| 欧美日韩成人综合| 成人午夜大片免费观看| 亚洲综合成人在线视频| 国产农村妇女毛片精品久久麻豆 | 精品剧情在线观看| 色悠悠亚洲一区二区| 精品无码三级在线观看视频| 一区二区三区四区在线免费观看| 久久嫩草精品久久久精品一| 欧美日韩亚洲综合在线 | 国产伦精品一区二区三区免费| 一区二区三区日韩| 国产精品看片你懂得| 欧美一区二区三区视频在线| 成人免费观看视频| 国产综合久久久久影院| 亚洲一区二区三区视频在线播放| 国产亚洲欧美日韩在线一区| 欧美一区二区三区日韩视频| 欧美日韩国产首页在线观看| 91国偷自产一区二区开放时间| 成人激情校园春色| 国产九九视频一区二区三区| 久久精品国产精品亚洲综合| 中文字幕+乱码+中文字幕一区| 日韩欧美综合一区| 欧美一区二区三区在线视频| 欧美影院午夜播放| 国产精品传媒在线| 91精品国产综合久久蜜臀| 在线精品视频一区二区| av影院午夜一区| 成人黄色大片在线观看| 99精品视频在线观看| 91免费在线视频观看| 91老师片黄在线观看| 在线观看国产91| 欧美日韩国产高清一区二区| 这里只有精品免费| 日韩女优视频免费观看| 久久久91精品国产一区二区三区| 91精品国产麻豆| 欧美videos中文字幕| 久久久影视传媒| 综合久久久久久| 亚洲伊人色欲综合网| 日韩精品欧美成人高清一区二区| 午夜a成v人精品| 久草热8精品视频在线观看| 国产尤物一区二区| 高清beeg欧美| 日本福利一区二区| 欧美大度的电影原声| 国产精品丝袜一区| 亚洲一区在线观看网站| 精品综合久久久久久8888| 成人a免费在线看| 欧美在线观看视频一区二区| 欧美一卡二卡三卡四卡| 欧美精彩视频一区二区三区| 亚洲最新在线观看| 国产一区二区三区视频在线播放| 99精品久久99久久久久| 欧美一区二区大片| 亚洲欧美日本在线| 久久成人av少妇免费| 91首页免费视频| 精品国产伦一区二区三区观看方式 | 国产精品不卡一区| 亚洲第一激情av| 国产**成人网毛片九色| 欧美色电影在线| 欧美激情中文不卡| 日韩二区三区四区| 91美女片黄在线观看91美女| 精品区一区二区| 日韩黄色在线观看| 在线亚洲+欧美+日本专区| 久久久精品国产免大香伊| 亚洲精品成人少妇| 国内精品国产成人国产三级粉色| 99精品欧美一区| 国产人成一区二区三区影院| 日韩高清电影一区| 成人动漫一区二区在线| av电影天堂一区二区在线观看| 国产真实精品久久二三区| 欧美人妇做爰xxxⅹ性高电影| 国产亚洲综合在线| 久久国产视频网| 欧美午夜免费电影| 亚洲精品乱码久久久久久日本蜜臀| 国内外成人在线| 日韩欧美一区二区视频| 日韩精品91亚洲二区在线观看| 在线区一区二视频| 亚洲午夜久久久久中文字幕久| 成人性视频网站| 精品日韩成人av| 久久国产精品免费| 91精品国产综合久久香蕉的特点| 精品一区二区三区久久| 欧美成人免费网站| 蜜臀av性久久久久蜜臀av麻豆| 精品视频一区三区九区| 水蜜桃久久夜色精品一区的特点| 欧美酷刑日本凌虐凌虐| 日韩黄色一级片| 亚洲精品一区二区三区福利 | 在线免费观看视频一区| 最新久久zyz资源站| 99久久精品情趣| 日韩久久一区二区| 色婷婷亚洲精品| 午夜亚洲福利老司机| 91精品国产欧美一区二区18| 久久99精品一区二区三区| 久久嫩草精品久久久精品一| 成人精品一区二区三区中文字幕 | 亚洲成人自拍一区| 欧美区在线观看| 精品无码三级在线观看视频| 中文字幕免费一区| 色婷婷激情久久| 青娱乐精品视频在线| 久久精品人人做人人综合| aaa亚洲精品一二三区| 综合av第一页| 欧美精品99久久久**| 国产麻豆日韩欧美久久| 综合中文字幕亚洲| 日韩一区二区在线免费观看| 国产一区二区导航在线播放| 亚洲丝袜美腿综合| www.亚洲免费av| 亚洲电影你懂得| 久久久国产精品不卡| 在线免费亚洲电影| 国产精品主播直播| 一区二区三区不卡在线观看| 日韩欧美在线综合网| a4yy欧美一区二区三区| 久久99精品国产麻豆不卡| 中文字幕一区二区三区四区| 欧美一区二区三区播放老司机| 成人免费av资源| 日本少妇一区二区| 国产在线观看一区二区| 亚洲一区在线观看网站| 久久久久久久性| 欧美久久一二三四区| 日本最新不卡在线| 在线播放中文一区| 蜜桃av一区二区在线观看 | 欧美变态tickle挠乳网站| 国产在线视频精品一区| 亚洲天堂精品视频| 国产视频911| 91久久精品一区二区三| 国产一区999| 日本女人一区二区三区| 亚洲日本va在线观看| 国产日韩v精品一区二区| 欧美高清www午色夜在线视频| 91小视频在线|