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:
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.
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!