1 回答

TA貢獻1752條經驗 獲得超4個贊
使用 plainhttp.Handler和 a之間的區別http.HanlderFunc在這里并不重要。http.HandleFunc只是一種將常規函數轉換為 a 的方法http.Handler- 它本質上與原始版本的limit.
您對limit兩者的實現看起來都不錯;可能第二個更好,因為它更簡單。相反,問題出在main. 當您調用http.ListenAndServeTLS并為最終參數提供值時,它會請求僅將您作為最終參數傳入的處理程序用作根請求處理程序。除非您作為最后一個參數傳入,否則對http.Handle()或的任何調用都會被忽略。http.HandleFunc()nil
您要做的是應用于limit您要限制的特定處理程序。為此,您有兩種選擇。ServeMux首先,您可以在第一個代碼片段中使用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或者,您可以做一些更像您的第二個代碼片段的事情,但將最后一個參數傳遞給http.ListenAndServeTLS以便http.ServeMux使用默認值,這意味著http.HandleFunc()將尊重對的調用:
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))
}
對于一個簡單的應用程序,第一種方法可能沒問題。對于更復雜的事情,我推薦后一種方法,因為如果您打開多個服務器或做其他更復雜的事情,它就會起作用。
- 1 回答
- 0 關注
- 95 瀏覽
添加回答
舉報