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

主頁(yè) > 知識(shí)庫(kù) > 如何編寫(xiě)Go語(yǔ)言中間件的實(shí)例教程

如何編寫(xiě)Go語(yǔ)言中間件的實(shí)例教程

熱門(mén)標(biāo)簽:鄭州亮點(diǎn)科技用的什么外呼系統(tǒng) 阿里云ai電話機(jī)器人 釘釘有地圖標(biāo)注功能嗎 浙江高頻外呼系統(tǒng)多少錢(qián)一個(gè)月 濱州自動(dòng)電銷機(jī)器人排名 建造者2地圖標(biāo)注 黃岡人工智能電銷機(jī)器人哪個(gè)好 惠州電銷防封電話卡 汕頭小型外呼系統(tǒng)

引言

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

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

縱觀Go語(yǔ)言,中間件是非常普遍的,即使在標(biāo)準(zhǔn)庫(kù)中。雖然開(kāi)始的時(shí)候不會(huì)那么明顯,在標(biāo)準(zhǔn)庫(kù)net/http中的函數(shù)StripText或者TimeoutHandler就是我們要定義和的中間件的樣子,處理請(qǐng)求和相應(yīng)的時(shí)候他們包裝你的handler,并處理一些額外的步驟。

一開(kāi)始,我們認(rèn)為編寫(xiě)中間件似乎很容易,但是我們實(shí)際編寫(xiě)的時(shí)候也會(huì)遇到各種各樣的坑。讓我們來(lái)看看一些例子。

1、讀取請(qǐng)求

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

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

我們想要將所有的請(qǐng)求重定向到一個(gè)斜杠——比方說(shuō)/message/,到它們的非斜杠等效,比如/message。我們可以這樣寫(xiě):

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)
 })
}

有沒(méi)有很簡(jiǎn)單。

2、修改請(qǐng)求

比方說(shuō),我們想要向請(qǐng)求添加一個(gè)標(biāo)題,或者修改它。http.Handler文檔中指明:

除了讀取主體之外,處理程序不應(yīng)該修改所提供的請(qǐng)求。

Go標(biāo)準(zhǔn)庫(kù)復(fù)制http.Request。請(qǐng)求對(duì)象在將其傳遞到響應(yīng)鏈之前,我們也應(yīng)該這樣做。假設(shè)我們想在每個(gè)請(qǐng)求上設(shè)置Request-Id頭,以便內(nèi)部跟蹤。創(chuàng)建*Request的淺副本,并在代理之前修改標(biāo)題。

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、編寫(xiě)響應(yīng)頭

如果你想設(shè)置響應(yīng)頭,你可以只寫(xiě)它們,然后代理請(qǐng)求。

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)
 })
}

上面的問(wèn)題是,如果內(nèi)部處理器也設(shè)置了服務(wù)器頭,那么你的頭將被覆蓋。如果不想公開(kāi)內(nèi)部軟件的服務(wù)器頭,或者如果想在發(fā)送響應(yīng)給客戶端之前去掉頭部,這可能會(huì)帶來(lái)問(wèn)題。

要做到這一點(diǎn),我們必須自己實(shí)現(xiàn)ResponseWriter接口。大多數(shù)時(shí)候,我們只會(huì)代理到底層的ResponseWriter,但是如果用戶試圖寫(xiě)一個(gè)響應(yīng),我們就會(huì)潛入并添加我們的標(biāo)題。

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)
}

要在我們的中間件中使用它,我們會(huì)寫(xiě):

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)
 })
}

問(wèn)題

如果用戶從不調(diào)用Write或WriteHeader呢?例如,有一個(gè)200狀態(tài)并且是空body,或者對(duì)選項(xiàng)請(qǐng)求的響應(yīng)——我們的攔截函數(shù)都不會(huì)運(yùn)行。因此,我們應(yīng)該在ServeHTTP調(diào)用之后再添加校驗(yàn)。

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接口只需要有三種方法。但在實(shí)踐中,它也可以對(duì)其他接口作出響應(yīng),例如http.Pusher。你的中間件可能會(huì)意外地禁用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()
 }
}

總結(jié)

通過(guò)以上的學(xué)習(xí),不知道大家對(duì)Go編寫(xiě)中間件有沒(méi)有一個(gè)完整的認(rèn)識(shí)。大家也可以嘗試著用Go去編寫(xiě)一個(gè)中間件。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

標(biāo)簽:晉中 滄州 昭通 駐馬店 東營(yíng) 阿壩 瀘州 泰安

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《如何編寫(xiě)Go語(yǔ)言中間件的實(shí)例教程》,本文關(guān)鍵詞  如何,編寫(xiě),語(yǔ)言,中間件,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《如何編寫(xiě)Go語(yǔ)言中間件的實(shí)例教程》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于如何編寫(xiě)Go語(yǔ)言中間件的實(shí)例教程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产老女人精品毛片久久| 色视频一区二区| 91欧美一区二区| 日韩欧美不卡在线观看视频| 国产精品久久久99| 韩国一区二区在线观看| 欧美日韩成人综合| 国产精品久久精品日日| 精品一区二区三区欧美| 欧美日韩一二三区| 国产精品的网站| 国产精品中文欧美| 精品久久免费看| 美女性感视频久久| 欧美精品在线观看播放| 中文字幕一区二区三区四区不卡| 韩国三级电影一区二区| 在线不卡欧美精品一区二区三区| 亚洲国产精品久久久男人的天堂| 成人黄色a**站在线观看| 久久夜色精品一区| 蜜桃视频在线观看一区| 欧美日韩中文字幕精品| 亚洲美女精品一区| av电影天堂一区二区在线观看| 久久人人爽人人爽| 精品一区二区三区在线观看国产| 欧美一级在线视频| 性欧美疯狂xxxxbbbb| 欧美午夜不卡在线观看免费| 一区二区三区欧美视频| 色欧美乱欧美15图片| 中文字幕一区二区三| av在线不卡网| 国产精品电影院| 99久久777色| 1024成人网色www| 91丨porny丨国产入口| 亚洲图片你懂的| 91久久香蕉国产日韩欧美9色| 国产精品天干天干在线综合| 岛国一区二区在线观看| 成人免费在线观看入口| 在线观看亚洲a| 天天亚洲美女在线视频| 欧美第一区第二区| 国产一区二区福利视频| 中文字幕乱码久久午夜不卡| 99在线热播精品免费| 国产成人精品网址| 国产精品色一区二区三区| 成人精品一区二区三区中文字幕| 亚洲视频在线观看三级| 欧洲一区二区三区免费视频| 日韩精品一二区| 精品国产一区久久| 99视频精品全部免费在线| 一区二区三区四区不卡视频 | 亚洲免费观看视频| 欧美日韩视频在线第一区| 麻豆国产欧美一区二区三区| 久久久国产精华| 91偷拍与自偷拍精品| 日韩av在线播放中文字幕| 久久久久久久久久久黄色| 成人国产在线观看| 天天做天天摸天天爽国产一区| 久久综合久久99| 日本乱人伦一区| 激情成人综合网| 亚洲精品少妇30p| 精品噜噜噜噜久久久久久久久试看| 国产a精品视频| 日本不卡视频在线观看| 国产精品久久久久久久久免费樱桃| 欧美日韩亚洲国产综合| 国产成人av资源| 日韩av电影天堂| 亚洲欧美色综合| 久久久久久97三级| 91精品婷婷国产综合久久| 成人av手机在线观看| 日韩av一区二区在线影视| 国产精品第四页| 精品美女在线观看| 欧美亚洲一区二区三区四区| 国内精品伊人久久久久av一坑| 亚洲一区在线看| 日本一二三四高清不卡| 精品乱人伦一区二区三区| 欧美日韩一区二区三区不卡| 91亚洲国产成人精品一区二区三 | 精品av综合导航| 欧美在线观看18| 成人白浆超碰人人人人| 国产在线精品一区二区夜色| 三级亚洲高清视频| 亚洲精品日韩专区silk| 欧美韩国一区二区| 26uuu精品一区二区在线观看| 欧美日韩精品欧美日韩精品| 91福利小视频| 99re这里都是精品| 成人ar影院免费观看视频| 国产成人综合亚洲网站| 狠狠v欧美v日韩v亚洲ⅴ| 久久国产精品99久久人人澡| 日日欢夜夜爽一区| 五月激情综合网| 亚洲一卡二卡三卡四卡无卡久久| 最近中文字幕一区二区三区| 中文字幕一区二| 亚洲视频小说图片| 中文字幕一区免费在线观看| 国产成人av电影在线观看| 久久99国产精品免费| 毛片不卡一区二区| 国模少妇一区二区三区| 国内精品国产成人| 国产一区不卡视频| 国产成人av电影在线观看| 波多野结衣欧美| 一本久久a久久精品亚洲| 欧美三级在线看| 宅男噜噜噜66一区二区66| 欧美一区午夜视频在线观看 | 欧美中文字幕久久| 在线观看www91| 91麻豆精品国产91久久久| 日韩免费观看高清完整版在线观看| 日韩精品在线一区| 久久久精品国产99久久精品芒果| 亚洲国产精品成人综合 | 国产精品亚洲视频| 91在线视频播放地址| 欧美午夜片在线看| 91精品在线一区二区| 久久女同精品一区二区| 国产精品每日更新| 午夜成人在线视频| 激情五月激情综合网| 99国产欧美另类久久久精品| 欧美日本韩国一区| 日韩精品专区在线影院重磅| 国产亚洲视频系列| 一区二区三区在线视频免费观看| 日韩成人精品在线| 成人午夜又粗又硬又大| 欧美亚洲尤物久久| 国产偷国产偷精品高清尤物 | 日韩视频免费观看高清完整版在线观看| 欧美精品一区二区三区蜜桃视频| 18欧美乱大交hd1984| 九色porny丨国产精品| 色综合中文字幕国产 | 亚洲日本韩国一区| 麻豆视频一区二区| 99久久国产综合精品麻豆| 日韩视频在线一区二区| 亚洲婷婷综合色高清在线| 日日摸夜夜添夜夜添亚洲女人| 成人在线视频首页| 欧美一区二区三区思思人 | 久久免费美女视频| 亚洲成人综合在线| 成人黄色在线网站| 欧美va亚洲va| 日韩一区二区在线观看| 欧美激情在线观看视频免费| 国产精品国产三级国产普通话蜜臀| 国产成人综合亚洲网站| 欧美性三三影院| 国产精品久久久久久久午夜片| 午夜精品视频一区| 欧美三级电影在线观看| 精品成人在线观看| 日韩国产精品久久久久久亚洲| 97精品久久久久中文字幕 | 婷婷综合久久一区二区三区| 国产高清精品网站| 欧美一区二区三区白人| 亚洲最新视频在线播放| 国产精品羞羞答答xxdd| 久久综合色综合88| 久久精品久久99精品久久| 91精品福利在线一区二区三区 | 一区二区三区蜜桃| 色综合中文综合网| 国产福利一区二区三区| 欧美成人高清电影在线| 日本三级韩国三级欧美三级| 欧美色综合影院| 亚洲在线视频免费观看| 99re这里都是精品| 亚洲精品日产精品乱码不卡| 色先锋久久av资源部| 一区二区三区国产精品| 欧美日韩在线播放三区四区| 亚洲午夜久久久久久久久电影院 | 国产大陆精品国产|