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
Patricia ArquetteOriginal
2024-11-09 06:52:02762Durchsuche

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)

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))

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, ...))
}

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!

Stellungnahme:
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