ホームページ > バックエンド開発 > Golang > Web ブラウザを使用しているときに Go の `HandleFunc` が 2 回呼び出されるのはなぜですか?

Web ブラウザを使用しているときに Go の `HandleFunc` が 2 回呼び出されるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-15 08:21:18
オリジナル
248 人が閲覧しました

Why is my Go `HandleFunc` called twice when using a web browser?

HttpHandler: HandleFunc の予期しない二重呼び出し

はじめに

http.ServeMux を使用する場合Go Web サーバーのマルチプレクサーでは、登録されていることが観察されます。ハンドラー関数 (HandleFunc) は、Web ブラウザーからのリクエストごとに 2 回呼び出されます。この動作は、意図した機能に反しています。

問題

カウンターをインクリメントするハンドラー関数を備えた基本的な Web サーバーを実装すると、カウンターがインクリメントされることが観察されます。ブラウザリクエストごとに 2 回。ただし、curl を使用する場合、ハンドラーは予想どおり 1 回だけ呼び出されます。

原因

リクエストをログに記録した後、ブラウザーが次のリクエストも送信していることがわかります。 /ファビコン.ico.これは、通常ブラウザのアドレス バーまたはタブに表示される小さなアイコンに対するリクエストです。 ServeMux マルチプレクサーはデフォルトですべての URL と一致するため、この追加リクエストに対して登録されたハンドラーを呼び出し、二重呼び出しが発生します。

解決策

ハンドラーがfavicon.ico リクエストに対して呼び出される場合、2 つのアプローチが可能です。検討:

  1. 特定の 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.

  1. デフォルト パターンのハンドラーをスキップします:

    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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート