Kontext in Golang-Anfrage an Middleware übergeben
Das Verständnis des in Golang 1.7 eingeführten Kontextmechanismus kann eine Herausforderung sein. In diesem Artikel soll erläutert werden, wie Kontext effektiv an Middleware- und Handlerfunktionen übergeben werden kann.
Ableiten von Kontexten
Wie im Blogbeitrag „Go Concurrency Patterns“ erwähnt, können Sie Kontexte ableiten aus dem Hintergrundkontext. Das Request-Objekt stellt auch die Methoden Context und WithContext bereit. Dadurch können Sie benutzerdefinierte Kontexte für bestimmte Zwecke erstellen.
Timeout implementieren
In Ihrem Anforderungshandler können Sie mithilfe der WithTimeout-Methode ein Timeout angeben. Dadurch wird ein abgeleiteter Kontext mit einem festgelegten Zeitlimit erstellt.
ctx, cancel := context.WithTimeout(r.Context(), time.Duration(60*time.Second)) defer cancel() r = r.WithContext(ctx)
Benutzerinformationen zum Kontext hinzufügen
In Ihrem Autorisierungsprüfer können Sie zuvor Benutzerinformationen zum Kontext hinzufügen Aufruf von ServeHTTP.
type ContextKey string const ContextUserKey ContextKey = "user" // ... ctx := context.WithValue(r.Context(), ContextUserKey, "theuser") h.ServeHTTP(w, r.WithContext(ctx))
Abrufen von Benutzerinformationen aus dem Kontext
Aus dem Handler heraus können Sie auf die Benutzerinformationen aus dem Kontext zugreifen.
user := r.Context().Value(ContextUserKey) doSomethingForThisUser(user.(string))
Middleware mit Kontext verketten
In Ihrer Hauptfunktion können Sie Middleware-Handler mit util.UseMiddleware verketten und dabei den Kontext über jeden Handler weitergeben.
router.Handle("/hello", util.UseMiddleware(authCheck, HandlerW, ...))
Fazit
Indem Sie diese Schritte befolgen, können Sie den Kontext in Golang-Anfragen effektiv an Middleware- und Handlerfunktionen übergeben, wodurch die Flexibilität erhöht und die Thread-Sicherheit in Ihrem Code aufrechterhalten wird.
Das obige ist der detaillierte Inhalt vonWie kann der Kontext effektiv an Middleware und Handler in Golang übergeben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!