第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

Go
慕哥6287543 2022-06-01 17:44:45
我需要將GetAssetsCompute函數(shù)包裝在中間件中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    })}但是因?yàn)橹虚g件將 HTTP 處理程序作為參數(shù),而我的函數(shù)不是處理程序,所以我不能。我正在考慮做這樣的事情。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 {}這個(gè)對(duì)嗎?或者有沒有更好的方法來(lái)做到這一點(diǎn)。同樣在中間件內(nèi)部,我需要訪問 URL 端點(diǎn),進(jìn)行一些處理并存儲(chǔ)這個(gè)處理后的值,然后再次在主處理程序中訪問它。我怎樣才能做到這一點(diǎn)?編輯:我想將此中間件僅應(yīng)用于我擁有的端點(diǎn)的子集(> 1)。不是全部我還需要處理程序中函數(shù)中assetService使用的變量。GetAssetsCompute(assetService ServiceType)所以,我也需要這個(gè)閉包。
查看完整描述

1 回答

?
鴻蒙傳說(shuō)

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)入處理程序。


查看完整回答
反對(duì) 回復(fù) 2022-06-01
  • 1 回答
  • 0 關(guān)注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)