HttpHandler: HandleFunc の予期しない二重呼び出し
はじめに
http.ServeMux を使用する場合Go Web サーバーのマルチプレクサーでは、登録されていることが観察されます。ハンドラー関数 (HandleFunc) は、Web ブラウザーからのリクエストごとに 2 回呼び出されます。この動作は、意図した機能に反しています。
問題
カウンターをインクリメントするハンドラー関数を備えた基本的な Web サーバーを実装すると、カウンターがインクリメントされることが観察されます。ブラウザリクエストごとに 2 回。ただし、curl を使用する場合、ハンドラーは予想どおり 1 回だけ呼び出されます。
原因
リクエストをログに記録した後、ブラウザーが次のリクエストも送信していることがわかります。 /ファビコン.ico.これは、通常ブラウザのアドレス バーまたはタブに表示される小さなアイコンに対するリクエストです。 ServeMux マルチプレクサーはデフォルトですべての URL と一致するため、この追加リクエストに対して登録されたハンドラーを呼び出し、二重呼び出しが発生します。
解決策
ハンドラーがfavicon.ico リクエストに対して呼び出される場合、2 つのアプローチが可能です。検討:
特定の favicon.ico ハンドラーを追加:
func favicon(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "favicon.ico") } func main() { mux := http.NewServeMux() mux.HandleFunc("/", hello) mux.HandleFunc("/favicon.ico", favicon) http.ListenAndServe(":8000", mux) }
/ に別のハンドラーを定義することによってfavicon.ico、hello ハンドラーは通常のページに対してのみ呼び出されますrequest.
デフォルト パターンのハンドラーをスキップします:
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/" { hello(w, r) } })
このアプローチでは URL.Path がチェックされます。リクエストを処理し、パスが正確に一致する場合にのみ hello ハンドラーが呼び出されるようにします。 /.
以上がWeb ブラウザを使用しているときに Go の `HandleFunc` が 2 回呼び出されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。