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」に対するものであることがわかります。これを回避するには、次のいずれかを行うことができます。
HTTP リクエスト フローを理解し、特定のエッジ ケースを考慮することは、 Go を使用して堅牢で信頼性の高い Web サーバーを作成します。
以上がGo HTTP 関数ハンドラーが 2 回呼び出されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。