Maison >développement back-end >Golang >Comment transmettre efficacement le contexte aux middlewares et aux gestionnaires dans Golang ?

Comment transmettre efficacement le contexte aux middlewares et aux gestionnaires dans Golang ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-10 10:36:02317parcourir

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

Passer le contexte dans la requête Golang au middleware

Comprendre le mécanisme de contexte introduit dans Golang 1.7 peut être difficile. Cet article vise à clarifier comment transmettre efficacement le contexte aux fonctions de middleware et de gestionnaire.

Dérivation des contextes

Comme mentionné dans le billet de blog Go Concurrency Patterns, vous pouvez dériver des contextes. du contexte d’arrière-plan. L'objet Request fournit également les méthodes Context et WithContext. Cela vous permet de créer des contextes personnalisés à des fins spécifiques.

Implémentation du délai d'attente

Dans votre gestionnaire de requêtes, vous pouvez spécifier un délai d'attente à l'aide de la méthode WithTimeout. Cela crée un contexte dérivé avec un délai d'expiration défini.

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

Ajout d'informations utilisateur au contexte

Dans votre vérificateur d'autorisation, vous pouvez ajouter des informations utilisateur au contexte avant appelant ServeHTTP.

type ContextKey string

const ContextUserKey ContextKey = "user"

// ...

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

Récupération des informations utilisateur de Context

Depuis le gestionnaire, vous pouvez accéder aux informations utilisateur à partir du contexte.

user := r.Context().Value(ContextUserKey)
doSomethingForThisUser(user.(string))

Chainage du middleware avec le contexte

Dans votre fonction principale, vous pouvez enchaîner les gestionnaires de middleware à l'aide de util.UseMiddleware, en transmettant le contexte à travers chacun. handler.

router.Handle("/hello", util.UseMiddleware(authCheck, HandlerW, ...))

Conclusion

En suivant ces étapes, vous pouvez transmettre efficacement le contexte des requêtes Golang aux fonctions middleware et gestionnaire, améliorant ainsi la flexibilité et maintenant la sécurité des threads au sein votre code.

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