1 回答

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
使用 plainhttp.Handler和 a之間的區(qū)別http.HanlderFunc在這里并不重要。http.HandleFunc只是一種將常規(guī)函數(shù)轉(zhuǎn)換為 a 的方法http.Handler- 它本質(zhì)上與原始版本的limit.
您對(duì)limit兩者的實(shí)現(xiàn)看起來都不錯(cuò);可能第二個(gè)更好,因?yàn)樗?jiǎn)單。相反,問題出在main. 當(dāng)您調(diào)用http.ListenAndServeTLS并為最終參數(shù)提供值時(shí),它會(huì)請(qǐng)求僅將您作為最終參數(shù)傳入的處理程序用作根請(qǐng)求處理程序。除非您作為最后一個(gè)參數(shù)傳入,否則對(duì)http.Handle()或的任何調(diào)用都會(huì)被忽略。http.HandleFunc()nil
您要做的是應(yīng)用于limit您要限制的特定處理程序。為此,您有兩種選擇。ServeMux首先,您可以在第一個(gè)代碼片段中使用like:
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", createNewToken)
// Limit only the handler for "/notify".
mux.HandleFunc("/notify", limit(sendPushNotificationToAllTokens))
// Don't limit the whole mux.
log.Fatal(http.ListenAndServeTLS(":5050", "localhost.crt", "localhost.key", mux))
}
nil或者,您可以做一些更像您的第二個(gè)代碼片段的事情,但將最后一個(gè)參數(shù)傳遞給http.ListenAndServeTLS以便http.ServeMux使用默認(rèn)值,這意味著http.HandleFunc()將尊重對(duì)的調(diào)用:
func main() {
http.HandleFunc("/", createNewToken)
// Limit only the handler for "/notify".
http.HandleFunc("/notify", limit(sendPushNotificationToAllTokens))
// Pass in nil here so that http.DefaultServeMux is used.
log.Fatal(http.ListenAndServeTLS(":5050", "localhost.crt", "localhost.key", nil))
}
對(duì)于一個(gè)簡(jiǎn)單的應(yīng)用程序,第一種方法可能沒問題。對(duì)于更復(fù)雜的事情,我推薦后一種方法,因?yàn)槿绻蜷_多個(gè)服務(wù)器或做其他更復(fù)雜的事情,它就會(huì)起作用。
- 1 回答
- 0 關(guān)注
- 94 瀏覽
添加回答
舉報(bào)