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!