Maison > développement back-end > Golang > le corps du texte

Comment transmettre correctement le contexte dans le middleware et les gestionnaires dans Go ?

Patricia Arquette
Libérer: 2024-11-09 06:52:02
original
701 Les gens l'ont consulté

How to Properly Pass Context in Middleware and Handlers in Go?

Passer le contexte dans le middleware et les gestionnaires dans Go

Introduction

Comprendre le contexte dans Go peut prêter à confusion. Explorons comment transmettre efficacement le contexte au middleware et aux gestionnaires.

Passer le contexte dans le middleware

Pour transmettre le contexte au middleware, suivez ces étapes :

  1. Dérivez un nouveau contexte à partir du contexte de la requête en utilisant context.WithTimeout() ou context.WithValue().
  2. Appelez ServeHTTP avec la requête mise à jour, qui contient désormais le nouveau contexte.
  3. Dans le vérificateur d'autorisation, ajoutez les informations de l'utilisateur au contexte avant d'appeler ServeHTTP.

Par exemple, pour ajouter un délai d'attente à la requête :

ctx, cancel := context.WithTimeout(r.Context(), time.Duration(60*time.Second))
defer cancel()
r = r.WithContext(ctx)
Copier après la connexion

Passer le contexte dans les gestionnaires

À transmettre le contexte aux gestionnaires :

  1. Utilisez context.WithValue() pour ajouter des valeurs au contexte de la requête.
  2. Dans le gestionnaire, utilisez request.Context().Value() pour accéder les valeurs.

Par exemple, pour ajouter l'ID utilisateur au contexte :

ctx := context.WithValue(r.Context(), ContextUserKey, "theuser")
h.ServeHTTP(w, r.WithContext(ctx))
Copier après la connexion

Exemple de code

Voici un exemple d'implémentation d'un middleware et d'un gestionnaire en utilisant le contexte :

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
            }
            // Add authentication-specific context here
            h.ServeHTTP(w, r)
        })
    }
}

type Handler struct {
    ...
    ...
}

func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // Get context values here
    decoder := json.NewDecoder(r.Body)

    // ...
}

func main() {
    router := mux.NewRouter()
    authToken, ok := getAuthToken()
    if !ok {
        panic("...")
    }
    authCheck := checkAuth(authToken)
    h := Handler{
       ...
   } 
   router.Handle("/hello", util.UseMiddleware(authCheck, Handler, ...))
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal