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

王林
Freigeben: 2024-02-09 10:06:08
nach vorne
739 Leute haben es durchsucht

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)
Nach dem Login kopieren

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)
    })
}
Nach dem Login kopieren

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)
    }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage