Maison  >  Article  >  développement back-end  >  Comment transmettre le contexte des requêtes Golang aux middlewares et aux gestionnaires ?

Comment transmettre le contexte des requêtes Golang aux middlewares et aux gestionnaires ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-17 01:27:03683parcourir

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

Comment transmettre le contexte d'une requête Golang au middleware

Comprendre le contexte

Le contexte de Go, introduit dans la version 1.7, est un mécanisme pour associer des métadonnées aux requêtes. Il vous permet de transmettre des informations entre différentes parties de votre code, y compris le middleware et les gestionnaires.

Passer le contexte au middleware

Votre question soulève le problème de savoir comment transmettre le contexte à la fois au middleware et à un gestionnaire. Pour s'aligner sur l'exemple de code que vous avez fourni, la fonction checkAuth représenterait le middleware, tandis que Handler représente le gestionnaire.

Pour transmettre le contexte au middleware, vous utiliserez généralement la méthode WithContext sur l'objet de requête. Par exemple :

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

Passage du contexte au gestionnaire

Pour transmettre le contexte au gestionnaire, vous utiliserez à nouveau la méthode WithContext sur l'objet de requête. Dans la méthode ServeHTTP de votre gestionnaire, vous pouvez récupérer le contexte à l'aide de la méthode Value :

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

}

Exemple d'utilisation

Votre fonction principale pourrait ressembler à ce qui suit :

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

N'oubliez pas que le contexte ne doit être utilisé que pour transmettre des informations transitoires. Pour des données plus persistantes, utilisez une base de données ou un autre mécanisme de stockage.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn