首頁 > 後端開發 > Golang > 為什麼在使用網頁瀏覽器時我的 Go `HandleFunc` 被呼叫兩次?

為什麼在使用網頁瀏覽器時我的 Go `HandleFunc` 被呼叫兩次?

Mary-Kate Olsen
發布: 2024-12-15 08:21:18
原創
253 人瀏覽過

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

HttpHandler 的意外雙重呼叫:HandleFunc

概述Web 伺服器中的多工器,觀察到註冊的處理程序對於從Web 瀏覽器發出的每個請求,函數 (HandleFunc) 都會被呼叫兩次。此行為與預期功能相反。

問題

在使用可遞增計數器的處理程序函數實作基本 Web 伺服器時,可以觀察到計數器會遞增每個瀏覽器請求兩次。然而,當使用curl時,處理程序只會按預期被呼叫一次。

原因

記錄請求後,很明顯瀏覽器也發送了一個請求/favicon.ico。這是對通常顯示在瀏覽器網址列或選項卡中的小圖示的請求。由於 ServeMux 多工器預設會匹配所有 URL,因此它會為此附加請求呼叫已註冊的處理程序,從而導致雙重呼叫。

解決方案

防止處理程序為favicon.ico 請求呼叫時,可以用兩種方法考慮:

    加入特定的favicon.ico處理程序:
  1. 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處理程序

    跳過預設模式的處理程序:
  1. mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path == "/" {
        hello(w, r)
    }
    })
    登入後複製
    此方法檢查URL.Path並確保僅當路徑恰好為/.
  2. 時才呼叫hello 處理程序

以上是為什麼在使用網頁瀏覽器時我的 Go `HandleFunc` 被呼叫兩次?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板