如何編寫Go語言中介軟體的例項教程

2022-09-24 18:21:09 字數 2468 閱讀 6409

引言

web開發的背景下,「中介軟體」通常意思是「包裝原始應用並新增一些額外的功能的應用的一部分」程式設計客棧。這個概念似乎總是不被人理解,但是我認為中介軟體非常棒。

首先,乙個好的中介軟體有乙個責任就是可插程式設計客棧拔並且自足。這就意味著你可以在介面級別嵌入你的中介軟體他就能直接執行。它不會影響你編碼方式,不是框架,僅僅是你請求處理裡面的一層而已。完全沒必要重寫你的**,如果你想使用中介軟體的乙個功能,你就幫他插入到那裡,如果不想使用了,就可以直接移除。

縱觀go語言,中介軟體是非常普遍的,即使在標準庫中。雖然開始的時候不會那麼明顯,在標準庫net/http中的函式striptext或者timeouthandler就是我們要定義和的中介軟體的樣子,處理請求和相應的時候他們包裝你的handler,並處理一些額外的步驟。

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

1、讀取請求

在我們的示例中,所有的中介軟體都將接受http。處理程式作為乙個引數,並返回乙個http.handler。這使得人們很容易就能把中間產品串起來。我們所有的中間產品的基本模式是這樣的:

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

})}有沒有很簡單。

2、修改請求

比方說,我們想要向請求新增乙個標題,或者修改它。http.handler文件中指明:

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

go標準庫複製http.request。請求物件在將其傳遞到響應鏈之前,我們也應該這樣做。假設我們想在每個請求上設定request-id頭,以便內部跟蹤。建立*request的淺副本,並在**之前修改標題。

}3、編寫響應頭

如果你想設定響應頭,你可以只寫它們,然後**請求。

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

要做到這一點,我們必須自己實現responsewriter介面。大多數時候,我們只會**到底層的responsewriter,但是如果使用者試圖寫乙個響應,我們就會潛入並新增我們的標題。

}要在我們的中介軟體中使用它,我們會寫:

})}問題

如果使用者從不呼叫write或writeheader呢?例如,有乙個200狀態並且是空body,或者對選項請求的響應——我們的攔截函式都不會執行。因此,我們應該在servehttp呼叫之後再新增校驗。

if sw.wroteheaders == false

})}其他responsewriter介面

responsewriter介面只需要有三種方法。但在實踐中,它也可以對其他介面作出響應,例如http.pusher。你的中介軟體可能會意外地禁用http/2支援,這是不好的。

func (s *serverwriter) flush() }總結

通過以上的學習,不知道大家對go編寫中介軟體有沒有乙個完整的認識。大家也可以嘗試著用go去編寫乙個中介軟體。

本文標題: 如何編寫go語言中介軟體的例項教程

本文位址:

Go語言的中介軟體

go的net http設計的 特點就是特別容易構建中介軟體。gin也提供了類似的中介軟體。需要注意的是中介軟體只對註冊過的路由函式起作 對於分組路由,巢狀使 中介軟體,可以限定中介軟體的作 範圍。下面2個中介軟體作用 統計處理的延時 列印處理的狀態 中介軟體1 直接是乙個處理函式 func midd...

go的中介軟體

輸出2019 07 15 17 19 50 middleware1 1 2019 07 15 17 19 50 middleware2 1 handel func 2019 07 15 17 19 50 middleware2 2 2019 07 15 17 19 50 middleware1 2 ...

Go語言的Http 中介軟體實現

當你正在構建乙個web應用程式有可能要執行許多 甚至全部 的http請求一些共享功能,你可能想記錄每乙個request,gzip壓縮的每個response,或者做一些繁重的處理或者快取檢查。實現這個共享功能的一種方法是將其設定為中介軟體,他可以作為乙個獨立的程式,在正常的handlers處理之前。根...