1 回答
TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
看來(lái)您正在嘗試做兩件事。1 - 僅將中間件應(yīng)用于您的一些請(qǐng)求處理程序。2 - 將數(shù)據(jù)從您的中間件傳遞到您的請(qǐng)求處理程序。
對(duì)于第一個(gè),我可以想到三個(gè)選項(xiàng)。首先是您現(xiàn)在正在做的事情,有一個(gè)中間件函數(shù),當(dāng)您將處理程序函數(shù)傳遞給r.Handle. 偽代碼:
r.Handle("/path1", Mware(Handler1())).Methods("GET")
r.Handle("/path2", Mware(Handler2())).Methods("GET")
r.Handle("/path3-nomiddleware", Handler3()).Methods("GET")
您可以做的第二件事是將代碼添加到中間件以根據(jù) URI 路徑進(jìn)行過濾,然后使用r.Use. 偽代碼:
const mwarePaths []string = ...
func Mware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.RequestURI is in mwarePaths {
// do the middleware
}
}
}
r.Use(Mware)
第三,您可以將代碼放在直接在處理程序中調(diào)用的函數(shù)中,而不是像中間件一樣注冊(cè)它。偽代碼:
func myUtil(w http.ResponseWriter, r *http.Request){ ... }
func GetAssetsCompute(assetService ServiceType) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
myUtil(w, r)
// stuff here
})
}
第二件事——將數(shù)據(jù)從中間件傳遞到請(qǐng)求處理程序——這里有一些想法。
首先,如果你使用上面的常規(guī)函數(shù)、無(wú)中間件設(shè)置,這個(gè)問題就會(huì)消失,因?yàn)槟阍谔幚沓绦蛑行枰娜魏螙|西都可以只是你函數(shù)的返回值。
如果您確實(shí)使用中間件,您可以使用該context庫(kù)(也來(lái)自 gorilla)將變量綁定到 http.Request 實(shí)例以傳遞給您的處理程序:http ://www.gorillatoolkit.org/pkg/context 。使用它看起來(lái)像這樣:
import "github.com/gorilla/context"
func middleware(...) {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
context.Set(r, "myKey", "bar")
}
}
func handler(w http.ResponseWriter, r *http.Request) {
val, ok := context.GetOk(r, "myKey") // returns "bar", true
}
您選擇使用哪些選項(xiàng)取決于您(您知道自己的需求)。但是,正如評(píng)論中提到的,一個(gè)好的經(jīng)驗(yàn)法則是處理與請(qǐng)求處理程序所做的無(wú)關(guān)問題的代碼可以是中間件。處理與您的請(qǐng)求處理程序正在做什么直接相關(guān)的問題的代碼可以直接進(jìn)入處理程序。
- 1 回答
- 0 關(guān)注
- 167 瀏覽
添加回答
舉報(bào)
