Gestion dynamique des gestionnaires de routes HTTP dans Go
Lorsque vous travaillez avec des serveurs HTTP dans Go, il peut être avantageux d'avoir la flexibilité de modifier dynamiquement gestionnaires de route sans redémarrer l’application. Cet article fournit une solution à la fois pour le http.ServerMux natif et pour le mux.Router du populaire Gorilla Toolkit.
Traditionnellement, une approche de la gestion des routes consistait à gérer les fonctionnalités désactivées en renvoyant un code d'état 404. Cependant, une solution plus générale consiste à intercepter les requêtes entrantes et à vérifier si la route est actuellement activée.
À cette fin, nous introduisons le type Handlers, une collection de gestionnaires de route avec des indicateurs activés associés. La méthode ServeHTTP gère les requêtes entrantes en vérifiant l'indicateur et en appelant le gestionnaire ou en renvoyant une erreur 404.
La méthode HandleFunc enregistre les routes auprès du multiplexeur sous-jacent et les ajoute à la carte des gestionnaires. Lorsqu'elle est appelée ultérieurement, la méthode garantit que seuls les gestionnaires activés sont exécutés.
<code class="go">package main import ( "net/http" "sync" ) type HasHandleFunc interface { HandleFunc(pattern string, handler func(w http.ResponseWriter, req *http.Request)) } type Handler struct { http.HandlerFunc Enabled bool } type Handlers map[string]*Handler 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) } } func (h Handlers) HandleFunc(mux HasHandleFunc, pattern string, handler http.HandlerFunc) { h[pattern] = &Handler{handler, true} mux.HandleFunc(pattern, h.ServeHTTP) } func main() { 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 // the route to '/' is now disabled }) http.Handle("/", mux) http.ListenAndServe(":9020", nil) }</code>
Avec cette solution, vous pouvez désactiver ou activer dynamiquement les itinéraires et même configurer des modèles de routage basés sur le temps, répondant au besoin de flexibilité Gestion des routes HTTP dans Go.
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!