2 回答

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
您需要使用 .將mw.Middleware()語(yǔ)句的第二個(gè)參數(shù)包裝到類(lèi)型中。http.Handlerhttp.HandlerFunc()
func (h Handler) makeGetMany(v Injection) http.HandlerFunc {
return mw.Middleware(
mw.Allow("admin"),
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println("now we are sending response.");
json.NewEncoder(w).Encode(v.Share)
}),
)
}

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊
在 http 包中,?ListenAndServe具有以下簽名
func?ListenAndServe(addr?string,?handler?Handler)?error
其中Handler
(ie,?http.Handler
) 是一個(gè)接口
type?Handler?interface?{ ????ServeHTTP(ResponseWriter,?*Request) }
對(duì)于一個(gè) Web 應(yīng)用程序,只有一個(gè)ListenAndServe
調(diào)用,因此只有一個(gè)handler
,它需要處理所有訪問(wèn)點(diǎn),例如/url1
,/url2
等。如果我們從頭開(kāi)始編寫(xiě)handler
,實(shí)現(xiàn)可能是struct
一個(gè)圍繞數(shù)據(jù)庫(kù)句柄的自定義。它的ServeHTTP
方法是檢查訪問(wèn)點(diǎn),然后把相應(yīng)的內(nèi)容寫(xiě)入到ResponseWriter
,比較繁瑣和雜亂。
這就是ServeMux的動(dòng)機(jī),它router
在您的代碼中。它有一個(gè)ServeHTTP方法,因此它滿(mǎn)足http.Handler
接口并可用于ListenAndServe
.?此外,它還有HandleFunc
處理個(gè)別接入點(diǎn)的方法
func?(mux?*ServeMux)?HandleFunc(pattern?string, ????????????????????????????????handler?func(ResponseWriter,?*Request))
注意這里handler
不是 a?http.Handler
,即它沒(méi)有ServeHTTP
方法。它不必這樣做,因?yàn)樗?code>mux已經(jīng)擁有ServeHTTP
并且它的ServeHTTP
方法可以將各個(gè)訪問(wèn)點(diǎn)請(qǐng)求分派給相應(yīng)的處理程序。
請(qǐng)注意,它還有一個(gè)Handle
方法,該方法需要參數(shù)滿(mǎn)足http.Handler
接口。與方法相比,使用起來(lái)稍微不方便HandleFunc
。
func?(mux?*ServeMux)?Handle(pattern?string,?handler?Handler)
現(xiàn)在回到你的問(wèn)題,因?yàn)槟愦螂娫?code>router.HandleFunc,它的輸入不一定是http.Handler
。因此,另一種解決方案是用作func(ResponseWriter, *Request)
中間件和makeGetMany
方法的返回類(lèi)型。(中間件中的類(lèi)型斷言也需要更新,可能還需要更新更多代碼)
@xpare 的解決方案是進(jìn)行類(lèi)型轉(zhuǎn)換,以便所有函數(shù)簽名匹配,即轉(zhuǎn)換func(ResponseWriter, *Request)
為http.HandlerFunc
.?看看它是如何工作的也很有趣。
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)
// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
? ? f(w, r)
}
你可以看到它基本上定義了一個(gè)ServeHTTP調(diào)用自身的方法。
- 2 回答
- 0 關(guān)注
- 165 瀏覽
添加回答
舉報(bào)