Heim > Artikel > Backend-Entwicklung > Wie kann ich Kontextinformationen in Go-HTTP-Handlern und Middleware übergeben und darauf zugreifen?
Übergabe von Kontext in Middleware und HandlerFunc
In Go bietet das Kontextpaket Funktionen zum Übergeben von Informationen zwischen Anforderungshandlern. Dies ist besonders nützlich für Middleware, die Aktionen vor und nach der Ausführung einer Handler-Funktion ausführen kann.
Kontext erstellen und übergeben
Im Kontext von Middleware haben wir Sie können einen neuen Kontext erstellen, indem Sie context.WithValue für den Kontext der Anforderung aufrufen und ein Schlüssel-Wert-Paar bereitstellen. Dieser neue Kontext sollte dann verwendet werden, wenn die ServeHTTP-Methode des Handlers aufgerufen wird.
Im bereitgestellten Codeausschnitt empfängt beispielsweise die Middleware-Funktion checkAuth den Anforderungskontext und das Authentifizierungstoken als Eingabe. Es gibt eine umschlossene Handlerfunktion zurück, die das Authentifizierungstoken überprüft.
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) }) } }
Um den Kontext mit dem Authentifizierungstoken zu initialisieren, können wir context.WithValue für den Kontext der Anfrage aufrufen, wie unten gezeigt:
func main() { authToken, ok := getAuthToken() if !ok { panic("...") } ctx := context.WithValue(r.Context(), "auth_token", authToken) router.Handle("/hello", util.UseMiddleware(authCheck, Handler, ...)) }
Dieser neue Kontext wird dann verwendet, wenn der Middleware-Handler die ServeHTTP-Methode des ursprünglichen Handlers aufruft.
Auf Kontext in Handlern zugreifen
Der Handler kann auf den Kontext zugreifen Informationen durch Aufruf von r.Context(), das den aktuellen Kontext zurückgibt. Der Wert kann mit der Value-Methode abgerufen werden, wie im folgenden Codeausschnitt gezeigt:
func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) { authToken := r.Context().Value("auth_token").(string) // ... }
Das obige ist der detaillierte Inhalt vonWie kann ich Kontextinformationen in Go-HTTP-Handlern und Middleware übergeben und darauf zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!