Kontext verstehen
Der in Version 1.7 eingeführte Kontext von Go ist ein Mechanismus zum Zuordnen von Metadaten zu Anfragen. Es ermöglicht Ihnen, Informationen zwischen verschiedenen Teilen Ihres Codes, einschließlich Middleware und Handlern, weiterzugeben.
Kontext an Middleware übergeben
Ihre Frage wirft die Frage auf, wie der übergeben werden soll Kontext sowohl für Middleware als auch für einen Handler. Zur Übereinstimmung mit dem von Ihnen bereitgestellten Beispielcode würde die checkAuth-Funktion die Middleware darstellen, während Handler den Handler darstellt.
Um den Kontext an die Middleware zu übergeben, würden Sie normalerweise die WithContext-Methode für das Anforderungsobjekt verwenden. Zum Beispiel:
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 }) }
Übergabe des Kontexts an den Handler
Um den Kontext an den Handler zu übergeben, würden Sie erneut die WithContext-Methode für das Anforderungsobjekt verwenden. In der ServeHTTP-Methode Ihres Handlers können Sie den Kontext mithilfe der Value-Methode abrufen:
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 ... }
Beispielverwendung
Ihre Hauptfunktion könnte wie folgt aussehen:
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, ...)) }
Denken Sie daran, dass der Kontext nur zur Weitergabe vorübergehender Informationen verwendet werden sollte. Für dauerhaftere Daten verwenden Sie eine Datenbank oder einen anderen Speichermechanismus.
Das obige ist der detaillierte Inhalt vonWie übergebe ich Kontext in Golang-Anfragen an Middleware und Handler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!