ホームページ > バックエンド開発 > Golang > Go HTTP 関数ハンドラーが 2 回呼び出されるのはなぜですか?

Go HTTP 関数ハンドラーが 2 回呼び出されるのはなぜですか?

Patricia Arquette
リリース: 2024-12-15 09:27:14
オリジナル
505 人が閲覧しました

Why is my Go HTTP function handler called twice?

HTTP 関数ハンドラーが予期せず呼び出されました

Go で HTTP ハンドラーを使用する場合、リクエストがどのように処理されるかを理解することが重要です。一般的なシナリオでは、ブラウザはルート URL にリクエストを行うだけでなく、視覚的な目的で「/favicon.ico」という名前のアイコン ファイルもリクエストします。この追加リクエストにより、ハンドラー関数が 2 回呼び出される可能性があります。

例:

ページにアクセスするたびにカウンターをインクリメントする次のコードを考えてみましょう:

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
)

var counter int

func hello(w http.ResponseWriter, r *http.Request) {
    counter++
    io.WriteString(w, fmt.Sprintf("Hello world! Counter: %d", counter))
    log.Println("hello.")
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", hello)
    http.ListenAndServe(":8000", mux)
}
ログイン後にコピー

観察:

Web ブラウザでポート 8000 にアクセスすると、「hello」ハンドラーが 2 回呼び出されていることがわかります。これは、ブラウザも「/favicon.ico」をリクエストするためです。 cURL を使用して同じ URL にアクセスする場合、ハンドラーは 1 回だけ呼び出されます。

この問題を理解して解決するには、リクエストをログに記録するだけです。 2 番目のリクエストは「/favicon.ico」に対するものであることがわかります。これを回避するには、次のいずれかを行うことができます。

  • 「/favicon.ico」専用のハンドラーを作成し、プレースホルダー アイコンまたはファビコンを提供します。
  • 「/」を無視するように HTTP サーバーを構成します。 favicon.ico" リクエスト。

HTTP リクエスト フローを理解し、特定のエッジ ケースを考慮することは、 Go を使用して堅牢で信頼性の高い Web サーバーを作成します。

以上がGo HTTP 関数ハンドラーが 2 回呼び出されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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