亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

gorilla mux 中間件:包裝處理程序

gorilla mux 中間件:包裝處理程序

Go
慕哥6287543 2022-06-01 17:44:45
我需要將GetAssetsCompute函數包裝在中間件中r.Handle("/api/v1/assets/ComputeBlade", GetAssetsCompute(assetService)).Methods("GET")func GetAssetsCompute(assetService ServiceType) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        //  stuff here    })}但是因為中間件將 HTTP 處理程序作為參數,而我的函數不是處理程序,所以我不能。我正在考慮做這樣的事情。func GetAssetsCompute(assetService ServiceType) http.Handler {        return MyMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {            //  stuff here        }))    }func MyMiddleware(next http.Handler) http.Handler {}這個對嗎?或者有沒有更好的方法來做到這一點。同樣在中間件內部,我需要訪問 URL 端點,進行一些處理并存儲這個處理后的值,然后再次在主處理程序中訪問它。我怎樣才能做到這一點?編輯:我想將此中間件僅應用于我擁有的端點的子集(> 1)。不是全部我還需要處理程序中函數中assetService使用的變量。GetAssetsCompute(assetService ServiceType)所以,我也需要這個閉包。
查看完整描述

1 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

看來您正在嘗試做兩件事。1 - 僅將中間件應用于您的一些請求處理程序。2 - 將數據從您的中間件傳遞到您的請求處理程序。


對于第一個,我可以想到三個選項。首先是您現在正在做的事情,有一個中間件函數,當您將處理程序函數傳遞給r.Handle. 偽代碼:


r.Handle("/path1", Mware(Handler1())).Methods("GET")

r.Handle("/path2", Mware(Handler2())).Methods("GET")

r.Handle("/path3-nomiddleware", Handler3()).Methods("GET")

您可以做的第二件事是將代碼添加到中間件以根據 URI 路徑進行過濾,然后使用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)

第三,您可以將代碼放在直接在處理程序中調用的函數中,而不是像中間件一樣注冊它。偽代碼:


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

    })

}

第二件事——將數據從中間件傳遞到請求處理程序——這里有一些想法。


首先,如果你使用上面的常規函數、無中間件設置,這個問題就會消失,因為你在處理程序中需要的任何東西都可以只是你函數的返回值。


如果您確實使用中間件,您可以使用該context庫(也來自 gorilla)將變量綁定到 http.Request 實例以傳遞給您的處理程序:http ://www.gorillatoolkit.org/pkg/context 。使用它看起來像這樣:


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

}


您選擇使用哪些選項取決于您(您知道自己的需求)。但是,正如評論中提到的,一個好的經驗法則是處理與請求處理程序所做的無關問題的代碼可以是中間件。處理與您的請求處理程序正在做什么直接相關的問題的代碼可以直接進入處理程序。


查看完整回答
反對 回復 2022-06-01
  • 1 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號