Heim > Backend-Entwicklung > Golang > Wie übergebe ich den Kontext in Middleware und Handlern in Go ordnungsgemäß?

Wie übergebe ich den Kontext in Middleware und Handlern in Go ordnungsgemäß?

Patricia Arquette
Freigeben: 2024-11-09 06:52:02
Original
769 Leute haben es durchsucht

How to Properly Pass Context in Middleware and Handlers in Go?

Übergabe von Kontext in Middleware und Handlern in Go

Einführung

Das Verständnis des Kontexts in Go kann verwirrend sein. Lassen Sie uns untersuchen, wie Sie Kontext effektiv an Middleware und Handler übergeben können.

Kontext in Middleware übergeben

Um Kontext an Middleware zu übergeben, führen Sie die folgenden Schritte aus:

  1. Leiten Sie einen neuen ab Kontext aus dem Anforderungskontext mithilfe von context.WithTimeout() oder context.WithValue().
  2. Rufen Sie ServeHTTP mit der aktualisierten Anforderung auf, die nun den neuen Kontext enthält.
  3. Fügen Sie im Autorisierungsprüfer hinzu Fügen Sie die Informationen des Benutzers dem Kontext hinzu, bevor Sie ServeHTTP aufrufen.

Zum Beispiel, um der Anfrage eine Zeitüberschreitung hinzuzufügen:

ctx, cancel := context.WithTimeout(r.Context(), time.Duration(60*time.Second))
defer cancel()
r = r.WithContext(ctx)
Nach dem Login kopieren

Kontext in Handlern übergeben

An Übergeben Sie den Kontext an Handler:

  1. Verwenden Sie context.WithValue(), um Werte zum Kontext der Anforderung hinzuzufügen.
  2. Verwenden Sie im Handler request.Context().Value() für den Zugriff die Werte.

Zum Beispiel, um die Benutzer-ID zum Kontext hinzuzufügen:

ctx := context.WithValue(r.Context(), ContextUserKey, "theuser")
h.ServeHTTP(w, r.WithContext(ctx))
Nach dem Login kopieren

Beispielcode

Hier ist eine Beispielimplementierung von Middleware und einem Handler Kontext verwenden:

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
            }
            // Add authentication-specific context here
            h.ServeHTTP(w, r)
        })
    }
}

type Handler struct {
    ...
    ...
}

func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // Get context values here
    decoder := json.NewDecoder(r.Body)

    // ...
}

func main() {
    router := mux.NewRouter()
    authToken, ok := getAuthToken()
    if !ok {
        panic("...")
    }
    authCheck := checkAuth(authToken)
    h := Handler{
       ...
   } 
   router.Handle("/hello", util.UseMiddleware(authCheck, Handler, ...))
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie übergebe ich den Kontext in Middleware und Handlern in Go ordnungsgemäß?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage