How to Dynamically Manage HTTP Route Handlers in Go?

Linda Hamilton
Release: 2024-10-31 17:58:45
Original
554 people have browsed it

How to Dynamically Manage HTTP Route Handlers in Go?

Dynamically Managing HTTP Route Handlers in Go

When working with HTTP servers in Go, it can be beneficial to have the flexibility to dynamically modify route handlers without restarting the application. This article provides a solution for both the native http.ServerMux and the popular Gorilla Toolkit's mux.Router.

Traditionally, one approach to managing routes has been to handle disabled features by returning a 404 status code. However, a more general solution involves intercepting the incoming requests and checking if the route is currently enabled.

For this purpose, we introduce the Handlers type, a collection of route handlers with associated enabled flags. The ServeHTTP method handles incoming requests by checking the flag and either invoking the handler or returning a 404 error.

The HandleFunc method registers routes with the underlying multiplexer and adds them to the Handlers map. When subsequently called, the method ensures that only enabled handlers are executed.

<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>
Copy after login

With this solution, you can dynamically disable or enable routes and even set up time-based routing patterns, catering to the need for flexible HTTP route management in Go.

The above is the detailed content of How to Dynamically Manage HTTP Route Handlers in Go?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!