Comprendre le contexte
Le contexte de Go, introduit dans la version 1.7, est un mécanisme pour associer des métadonnées aux requêtes. Il vous permet de transmettre des informations entre différentes parties de votre code, y compris le middleware et les gestionnaires.
Passer le contexte au middleware
Votre question soulève le problème de savoir comment transmettre le contexte à la fois au middleware et à un gestionnaire. Pour s'aligner sur l'exemple de code que vous avez fourni, la fonction checkAuth représenterait le middleware, tandis que Handler représente le gestionnaire.
Pour transmettre le contexte au middleware, vous utiliserez généralement la méthode WithContext sur l'objet de requête. Par exemple :
func checkAuth(authToken string) http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() // Retrieve the current context from the request if r.Header.Get("Auth") != authToken { util.SendError(w, "...", http.StatusForbidden, false) return } h := r.Context().Value(key) // Retrieve the handler from context h.ServeHTTP(w, r) // Pass the request to the handler }) }
Passage du contexte au gestionnaire
Pour transmettre le contexte au gestionnaire, vous utiliserez à nouveau la méthode WithContext sur l'objet de requête. Dans la méthode ServeHTTP de votre gestionnaire, vous pouvez récupérer le contexte à l'aide de la méthode Value :
func (h *HandlerW) ServeHTTP(w http.ResponseWriter, r *http.Request) { ctx := r.Context() // Retrieve the context from the request decoder := json.NewDecoder(r.Body) // Decode request / context and get params var p params err := decoder.Decode(&p) if err != nil { ... return } // Perform GET request and pass context ... }
Exemple d'utilisation
Votre fonction principale pourrait ressembler à ce qui suit :
func main() { router := mux.NewRouter() // Initialize middleware handlers h := Handler{ ... } // Pass context to authCheck authToken, ok := getAuthToken() if !ok { panic("...") } authCheck := checkAuth(authToken) // Chain middleware handlers and pass context router.Handle("/hello", util.UseMiddleware(authCheck, h, ...)) }
N'oubliez pas que le contexte ne doit être utilisé que pour transmettre des informations transitoires. Pour des données plus persistantes, utilisez une base de données ou un autre mécanisme de stockage.
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!