Memahami Konteks
Konteks Go, yang diperkenalkan dalam versi 1.7, ialah mekanisme untuk mengaitkan metadata dengan permintaan. Ia membolehkan anda menghantar maklumat antara bahagian berlainan kod anda, termasuk perisian tengah dan pengendali.
Melalukan Konteks kepada Perisian Tengah
Soalan anda menimbulkan isu bagaimana untuk lulus konteks kepada perisian tengah dan pengendali. Untuk menyelaraskan dengan contoh kod yang anda berikan, fungsi checkAuth akan mewakili middleware, manakala Handler mewakili pengendali.
Untuk menghantar konteks kepada middleware, anda biasanya akan menggunakan kaedah WithContext pada objek permintaan. Contohnya:
func checkAuth(authToken string) http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() // Retrieve the current context from the request if r.Header.Get("Auth") != authToken { util.SendError(w, "...", http.StatusForbidden, false) return } h := r.Context().Value(key) // Retrieve the handler from context h.ServeHTTP(w, r) // Pass the request to the handler }) }
Mengirim Konteks kepada Pengendali
Untuk menghantar konteks kepada pengendali, anda sekali lagi akan menggunakan kaedah WithContext pada objek permintaan. Dalam kaedah ServeHTTP pengendali anda, anda boleh mendapatkan semula konteks menggunakan kaedah Nilai:
func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) { ctx := r.Context() // Retrieve the context from the request decoder := json.NewDecoder(r.Body) // Decode request / context and get params var p params err := decoder.Decode(&p) if err != nil { ... return } // Perform GET request and pass context ... }
Contoh Penggunaan
Fungsi utama anda mungkin kelihatan seperti berikut:
func main() { router := mux.NewRouter() // Initialize middleware handlers h := Handler{ ... } // Pass context to authCheck authToken, ok := getAuthToken() if !ok { panic("...") } authCheck := checkAuth(authToken) // Chain middleware handlers and pass context router.Handle("/hello", util.UseMiddleware(authCheck, h, ...)) }
Ingat, konteks hanya boleh digunakan untuk menghantar maklumat sementara. Untuk data yang lebih berterusan, gunakan pangkalan data atau mekanisme storan lain.
Atas ialah kandungan terperinci Bagaimana untuk Menghantar Permintaan Konteks dalam Golang kepada Middleware dan Pengendali?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!