Heim >Backend-Entwicklung >Golang >Legen Sie unterschiedliche Middleware für Unterrouten in Go-Chi fest

Legen Sie unterschiedliche Middleware für Unterrouten in Go-Chi fest

王林
王林nach vorne
2024-02-09 10:06:08739Durchsuche

Legen Sie unterschiedliche Middleware für Unterrouten in Go-Chi fest

In Go-Chi, dem Web-Framework der Go-Sprache, ist das Festlegen unterschiedlicher Middleware für Unterrouten eine häufige Anforderung. Middleware ist eine Funktion, die HTTP-Anfragen und -Antworten verarbeitet und einige zusätzliche Vorgänge ausführen kann, bevor und nachdem die Anfrage den Zielprozessor erreicht. Durch die Einrichtung unterschiedlicher Middleware für verschiedene Unterrouten können wir jede Unterroute entsprechend den Geschäftsanforderungen personalisieren. In diesem Artikel stellen wir vor, wie Sie verschiedene Middleware für Unterrouten in Go-Chi flexibel einrichten, um eine flexiblere Routing-Verarbeitung zu erreichen.

Frageinhalt

Ich habe einen Proxyserver, der über die Konfiguration mit mustBeSecure deaktiviert werden kann. Ich möchte, dass sich dieser Proxy in einer bestimmten Subdomäne anders verhält: „/application/health“, wodurch er immer unsicher wird. Alle Änderungen, die ich bisher versucht habe, sind fehlgeschlagen. Gibt es eine Möglichkeit, eine andere Gruppe für „/application/health“ zu konfigurieren, die weiterhin den Proxy verwendet, aber nie eine Authentifizierung erfordert?

router := chi.NewRouter()
router.Route("/", func(r chi.Router) {
    r.Use(chimw.Recoverer)
    router.Use(hlog.NewHandler(log.Logger))
    if mustBeSecure() {
        r.Use(keycloak.MustStandardKeycloakAuth("url"))
    }
    setProxy(r)
    r.Group(func(r chi.Router) {
        r.Get("/health", handleHealth())
    })
})
return http.ListenAndServe("0.0.0.0", router)

Wie gewünscht, hier ein Beispiel für setProxy()

func setProxy(r chi.Router) {
    r.Route("/application", func(r chi.Router) {
        r.Use(func(next http.Handler) http.Handler {
            return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
                ctx := context.WithValue(r.Context(), "target", "http:locahost:9999")
                r = r.WithContext(ctx)
                next.ServeHTTP(w, r)
            })
        })
        r.HandleFunc("/*", httputil.ReverseProxy{}.ServeHTTP)
    })
}

Workaround

Ich glaube, Sie versuchen das.

  • Router für alle /applicationRouten
  • verwenden
  • Statement GET /health
  • Erstellen Sie eine Gruppe (in /application) für alle anderen Routen
  • Bedingte Middleware anwenden

Ich habe den Code zum leichteren Verständnis etwas vereinfacht. Sie können weiterhin die setProxy-Funktion verwenden.

func main() {
    proxy, err := NewProxy("http://localhost:4422")
    if err != nil {
        panic(err)
    }

    router := chi.NewRouter()

    router.Get("/health", handleHealth)

    router.Route("/application", func(r chi.Router) {
        r.Get("/health", ProxyRequestHandler(proxy))

        r.Group(func(r chi.Router) {
            if mustBeSecure() {
                r.Use(keycloak.MustStandardKeycloakAuth("url"))
            }
            r.HandleFunc("/*", ProxyRequestHandler(proxy))
        })
    })

    http.ListenAndServe("0.0.0.0:4411", router)
}

func NewProxy(targetHost string) (*httputil.ReverseProxy, error) {
    targetUrl, err := url.Parse(targetHost)
    if err != nil {
        return nil, err
    }

    return httputil.NewSingleHostReverseProxy(targetUrl), nil
}

func ProxyRequestHandler(proxy *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) {
    return func(w http.ResponseWriter, r *http.Request) {
        proxy.ServeHTTP(w, r)
    }
}

Das obige ist der detaillierte Inhalt vonLegen Sie unterschiedliche Middleware für Unterrouten in Go-Chi fest. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen