Comment modifier dynamiquement les gestionnaires Mux dans les serveurs HTTP Golang
Dans Go, http.ServeMux et Gorilla's mux.Router fournissent des outils polyvalents pour la gestion Itinéraires HTTP. Cependant, il n'existe aucun mécanisme intégré pour modifier la fonction de gestionnaire associée à une route existante sans redémarrer l'application.
Solutions possibles :
Option 1 : Wrapper de gestionnaire personnalisé avec indicateur d'activation/désactivation
Cette approche implique la création d'un type de gestionnaire personnalisé qui intègre la fonction de gestionnaire réelle et inclut un indicateur activé. Le gestionnaire personnalisé peut ensuite être ajouté au multiplexeur, qui servira le gestionnaire si l'indicateur est défini sur true.
<code class="go">type Handler struct { http.HandlerFunc Enabled bool } type Handlers map[string]*Handler // Implementation of ServeHTTP that checks if the handler is enabled func (h Handlers) ServeHTTP(w http.ResponseWriter, r *http.Request) { path := r.URL.Path if handler, ok := h[path]; ok && handler.Enabled { handler.ServeHTTP(w, r) } else { http.Error(w, "Not Found", http.StatusNotFound) } }</code>
Ensuite, vous pouvez utiliser ce type de gestionnaire personnalisé avec http.ServeMux ou gorilla/mux pour activer ou désactiver les routes de manière dynamique.
Exemple avec http.ServeMux :
<code class="go">mux := http.NewServeMux() handlers := Handlers{} handlers.HandleFunc(mux, "/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("this will show once")) handlers["/"].Enabled = false }) http.Handle("/", mux)</code>
Option 2 : Middleware avec liste noire d'URL
Vous pouvez également implémenter un middleware qui vérifie l'URL demandée par rapport à une liste de routes désactivées. Si l'URL correspond à une route désactivée, le middleware peut empêcher l'exécution du gestionnaire et renvoyer une réponse personnalisée.
Exemple :
<code class="go">func DisableRouteMiddleware(disabledRoutes []string) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { for _, route := range disabledRoutes { if r.URL.Path == route { http.Error(w, "Disabled", http.StatusNotFound) return } } next.ServeHTTP(w, r) }) } }</code>
Vous pouvez ensuite utiliser ce middleware pour envelopper tous vos gestionnaires avant de les ajouter au multiplexeur.
Les deux approches vous permettent de désactiver ou d'activer dynamiquement des routes dans votre application sans nécessiter de redémarrage. Le choix de l'option à utiliser dépend de vos besoins spécifiques et du niveau de flexibilité dont vous avez besoin.
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!