HTTP-Routenhandler in Go dynamisch verwalten
Bei der Arbeit mit HTTP-Servern in Go kann es von Vorteil sein, über die Flexibilität zur dynamischen Änderung zu verfügen Routenhandler ohne Neustart der Anwendung. Dieser Artikel bietet eine Lösung sowohl für den nativen http.ServerMux als auch für den beliebten mux.Router des Gorilla Toolkits.
Traditionell bestand ein Ansatz zur Routenverwaltung darin, deaktivierte Funktionen durch die Rückgabe eines 404-Statuscodes zu behandeln. Eine allgemeinere Lösung besteht jedoch darin, die eingehenden Anfragen abzufangen und zu prüfen, ob die Route derzeit aktiviert ist.
Zu diesem Zweck führen wir den Typ „Handler“ ein, eine Sammlung von Routenhandlern mit zugehörigen aktivierten Flags. Die ServeHTTP-Methode verarbeitet eingehende Anfragen, indem sie das Flag überprüft und entweder den Handler aufruft oder einen 404-Fehler zurückgibt.
Die HandleFunc-Methode registriert Routen beim zugrunde liegenden Multiplexer und fügt sie der Handlers-Map hinzu. Beim anschließenden Aufruf stellt die Methode sicher, dass nur aktivierte Handler ausgeführt werden.
<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>
Mit dieser Lösung können Sie Routen dynamisch deaktivieren oder aktivieren und sogar zeitbasierte Routingmuster einrichten, um dem Bedarf an Flexibilität gerecht zu werden HTTP-Routenverwaltung in Go.
Das obige ist der detaillierte Inhalt vonWie verwalte ich HTTP-Routenhandler dynamisch in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!