Mengendalikan Berbilang Panggilan WriteHeader dalam Pelayan HTTP Go
Dalam pakej net/http Go, adalah penting untuk mengelakkan berbilang panggilan ke WriteHeader untuk sesuatu permintaan. Membuat panggilan goroutine dalam fungsi pengendali utama boleh membawa kepada isu ini, seperti yang ditunjukkan dalam contoh berikut:
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }) ... }
Dalam fungsi pengendali tanpa nama, kami sedang mencetak URL dan memulakan goroutine yang memanggil HandleIndex . Walau bagaimanapun, ini menyebabkan ralat "tindak balas berbilang.WriteHeader panggilan" dalam konsol.
Mengapa ini berlaku? Secara lalai, Go menetapkan status respons kepada 200 (HTTP OK) jika ia tidak ditetapkan secara eksplisit dalam fungsi pengendali. Dalam contoh ini, walaupun HandleIndex menetapkan pengepala dalam goroutine yang berasingan, fungsi pengendali utama selesai tanpa menulis apa-apa pada respons atau menetapkan status. Ini mencetuskan Go untuk menetapkan status secara automatik, mengakibatkan penulisan berbilang pengepala.
Untuk menyelesaikan isu ini, kami boleh mengalih keluar awalan go daripada go HandleIndex supaya ia dilaksanakan dalam goroutine yang sama dengan fungsi pengendali utama. Sebagai alternatif, dalam HandleIndex, kita boleh menetapkan pengepala respons sebelum fungsi pengendali utama kembali.
Pilihan lain ialah menggunakan perisian tengah untuk menetapkan pengepala respons sebelum permintaan mencapai fungsi pengendali utama. Dengan cara ini, fungsi pengendali utama tidak perlu menetapkan pengepala, dan perisian tengah memastikan bahawa pengepala ditetapkan sekali sahaja:
func main() { http.HandleFunc("/", middleware(HandleIndex)) ... } func middleware(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") next(w, r) } }
Dengan menggunakan perisian tengah, kami boleh memastikan bahawa pengepala respons adalah ditetapkan sebelum mengendalikan permintaan, mengelakkan sebarang kemungkinan isu dengan berbilang panggilan WriteHeader.
Atas ialah kandungan terperinci Mengapa Menggunakan Goroutines dengan `WriteHeader` dalam Pakej `net/http` Go Menyebabkan 'pelbagai respons.WriteHeader panggilan'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!