Wie übergebe ich Kontext in Golang-Anfragen an Middleware und Handler?

Susan Sarandon
Freigeben: 2024-11-17 01:27:03
Original
688 Leute haben es durchsucht

How to Pass Context in Golang Requests to Middleware and Handlers?

So übergeben Sie den Kontext in einer Golang-Anfrage an die Middleware

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
  })
}
Nach dem Login kopieren

Ü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
  ...

}
Nach dem Login kopieren

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, ...))
}
Nach dem Login kopieren

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!

Quelle:php.cn
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