Rumah >pembangunan bahagian belakang >Golang >Mengapakah Go `HandleFunc` saya dipanggil dua kali apabila menggunakan pelayar web?

Mengapakah Go `HandleFunc` saya dipanggil dua kali apabila menggunakan pelayar web?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-15 08:21:18248semak imbas

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

Seruan Berganda Tidak Dijangka HttpHandler: HandleFunc

Pengenalan

Apabila menggunakan http.Servex pemultipleks dalam pelayan web Go, diperhatikan bahawa a fungsi pengendali berdaftar (HandleFunc) digunakan dua kali untuk setiap permintaan yang dibuat daripada pelayar web. Tingkah laku ini bertentangan dengan kefungsian yang dimaksudkan.

Masalah

Apabila melaksanakan pelayan web asas dengan fungsi pengendali yang menambah pembilang, diperhatikan bahawa pembilang itu dinaikkan dua kali untuk setiap permintaan penyemak imbas. Walau bagaimanapun, apabila menggunakan curl, pengendali dipanggil sekali sahaja seperti yang dijangkakan.

Sebab

Selepas mengelog permintaan, menjadi jelas bahawa penyemak imbas juga menghantar permintaan untuk /favicon.ico. Ini ialah permintaan untuk ikon kecil yang biasanya dipaparkan dalam bar alamat atau tab penyemak imbas. Memandangkan pemultipleks ServeMux memadankan semua URL secara lalai, ia memanggil pengendali berdaftar untuk permintaan tambahan ini, menghasilkan penyeruan berganda.

Penyelesaian

Untuk menghalang pengendali daripada sedang digunakan untuk permintaan favicon.ico, dua pendekatan boleh dilakukan dipertimbangkan:

  1. Tambah Pengendali favicon.ico Khusus:

    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)
    }

Dengan mentakrifkan pengendali berasingan untuk / favicon.ico, pengendali hello hanya akan digunakan untuk halaman biasa permintaan.

  1. Langkau Pengendali untuk Corak Lalai:

    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path == "/" {
        hello(w, r)
    }
    })

Pendekatan ini menyemak URL.Path of permintaan dan memastikan pengendali helo dipanggil hanya apabila laluannya betul-betul /.

Atas ialah kandungan terperinci Mengapakah Go `HandleFunc` saya dipanggil dua kali apabila menggunakan pelayar web?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn