Maison >développement back-end >Golang >Comment transmettre correctement le contexte dans le middleware et les gestionnaires dans Go ?

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

Patricia Arquette
Patricia Arquetteoriginal
2024-11-09 06:52:02755parcourir

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)

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

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

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