Passage du contexte dans Middleware et HandlerFunc
Dans Go, le package de contexte fournit une fonctionnalité permettant de transmettre des informations entre les gestionnaires de requêtes. Ceci est particulièrement utile pour les middlewares, qui peuvent effectuer des actions avant et après l'exécution d'une fonction de gestionnaire.
Création et transmission de contexte
Dans le contexte du middleware, nous peut créer un nouveau contexte en appelant context.WithValue sur le contexte de la demande, en fournissant une paire clé et valeur. Ce nouveau contexte doit ensuite être utilisé lors de l'appel de la méthode ServeHTTP du gestionnaire.
Par exemple, dans l'extrait de code fourni, la fonction middleware checkAuth reçoit le contexte de la demande et le jeton d'authentification en entrée. Il renvoie une fonction de gestionnaire encapsulée qui vérifie le jeton d'authentification.
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 } h.ServeHTTP(w, r) }) } }
Pour initialiser le contexte avec le jeton d'authentification, nous pouvons appeler context.WithValue sur le contexte de la requête, comme indiqué ci-dessous :
func main() { authToken, ok := getAuthToken() if !ok { panic("...") } ctx := context.WithValue(r.Context(), "auth_token", authToken) router.Handle("/hello", util.UseMiddleware(authCheck, Handler, ...)) }
Ce nouveau contexte sera ensuite utilisé lorsque le gestionnaire de middleware appellera le ServeHTTP du gestionnaire d'origine. méthode.
Accès au contexte dans les gestionnaires
Le gestionnaire peut accéder aux informations de contexte en appelant r.Context(), qui renvoie le contexte actuel. La valeur peut être récupérée à l'aide de la méthode Value, comme indiqué dans l'extrait de code ci-dessous :
func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) { authToken := r.Context().Value("auth_token").(string) // ... }
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!