Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah saya boleh menghantar dan mengakses maklumat konteks dalam Go HTTP Handlers and Middleware?
Melalui Konteks dalam Middleware dan HandlerFunc
Dalam Go, pakej konteks menyediakan kefungsian untuk menghantar maklumat antara pengendali permintaan. Ini amat berguna untuk perisian tengah, yang boleh melakukan tindakan sebelum dan selepas pelaksanaan fungsi pengendali.
Mencipta dan Menghantar Konteks
Dalam konteks perisian tengah, kami boleh mencipta konteks baharu dengan memanggil context.WithValue pada konteks permintaan, menyediakan pasangan kunci dan nilai. Konteks baharu ini kemudiannya harus digunakan apabila memanggil kaedah ServeHTTP pengendali.
Sebagai contoh, dalam coretan kod yang disediakan, fungsi perisian tengah checkAuth menerima konteks permintaan dan token pengesahan sebagai input. Ia mengembalikan fungsi pengendali berbalut yang menyemak token pengesahan.
func checkAuth(authToken string) util.Middleware { return func(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Header.Get("Auth") != authToken { util.SendError(w, "...", http.StatusForbidden, false) return } h.ServeHTTP(w, r) }) } }
Untuk memulakan konteks dengan token pengesahan, kita boleh memanggil context.WithValue pada konteks permintaan, seperti yang ditunjukkan di bawah:
func main() { authToken, ok := getAuthToken() if !ok { panic("...") } ctx := context.WithValue(r.Context(), "auth_token", authToken) router.Handle("/hello", util.UseMiddleware(authCheck, Handler, ...)) }
Konteks baharu ini kemudiannya akan digunakan apabila pengendali middleware memanggil kaedah ServeHTTP pengendali asal.
Mengakses Konteks dalam Pengendali
Pengendali boleh mengakses konteks maklumat dengan memanggil r.Context(), yang mengembalikan konteks semasa. Nilai boleh diambil menggunakan kaedah Nilai, seperti yang ditunjukkan dalam coretan kod di bawah:
func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) { authToken := r.Context().Value("auth_token").(string) // ... }
Atas ialah kandungan terperinci Bagaimanakah saya boleh menghantar dan mengakses maklumat konteks dalam Go HTTP Handlers and Middleware?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!