Anda menghadapi senario di mana anda mempunyai middleware dalam Go yang cuba menetapkan pengepala "Pelayan" tersuai. Walau bagaimanapun, pengepala "Pelayan" sedia ada yang ditetapkan oleh aplikasi atau perisian tengah lain berterusan, menyebabkan berbilang pengepala "Pelayan" dalam respons.
Seperti semantik HTTP, mengubah suai pengepala respons selepas kaedah ServeHTTP kembali dilarang. Sekatan ini bertujuan untuk mewujudkan sempadan yang jelas antara pengendalian permintaan dan penyelesaian respons.
1. Custom ResponseWriter:
Tentukan pembalut ResponseWriter tersuai yang memintas operasi pengubahsuaian pengepala. Sebelum menulis sebarang pengepala, pembalut memasukkan pengepala "Pelayan" tersuai anda. Pendekatan ini menambah lapisan amaran tambahan tetapi menyediakan kawalan terperinci ke atas pengurusan pengepala.
Berikut ialah contoh pelaksanaan ResponseWriter tersuai:
type serverWriter struct { w http.ResponseWriter name string wroteHeader bool } func (s serverWriter) WriteHeader(code int) { if s.wroteHeader == false { s.w.Header().Set("Server", s.name) s.wroteHeader = true } s.w.WriteHeader(code) } func (s serverWriter) Write(b []byte) (int, error) { return s.w.Write(b) } func (s serverWriter) Header() http.Header { return s.w.Header() }
Dalam perisian tengah, anda boleh menggunakan ini ResponseWriter tersuai untuk mengawal sisipan pengepala:
func Server(h http.Handler, serverName string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { sw := serverWriter{ w: w, name: serverName, wroteHeader: false, } h.ServeHTTP(sw, r) }) }
2. Pembalikan Pesanan Middleware:
Pendekatan alternatif adalah untuk membalikkan susunan middleware supaya perisian tengah tetapan pengepala "Pelayan" anda dilaksanakan selepas semua perisian tengah yang lain. Ini memastikan pengubahsuaian pengepala anda ialah operasi terakhir sebelum respons dimuktamadkan.
3. Perisian Tengah Paling Dalam:
Jika boleh, letakkan perisian tengah tetapan pengepala "Pelayan" anda sebagai lapisan paling dalam bagi perisian tengah. Ini menghapuskan kemungkinan perisian tengah luar mengubah suai pengepala "Pelayan" selepas anda menetapkannya.
4. Pengubahsuaian Respons:
Sebagai langkah terakhir, anda boleh mempertimbangkan untuk menggunakan http.Handler tersuai yang memintas respons dan mengubah suai pengepala "Pelayan" dengan sewajarnya. Pendekatan ini memerlukan pengendalian yang teliti untuk mengelak daripada memecahkan fungsi lain dalam aplikasi anda.
Atas ialah kandungan terperinci Bagaimana untuk Mengawal Pengepala HTTP dengan Berkesan dalam Go Middleware?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!