Maison > développement back-end > Golang > Définir un middleware différent pour les sous-routes dans go-chi

Définir un middleware différent pour les sous-routes dans go-chi

王林
Libérer: 2024-02-09 10:06:08
avant
752 Les gens l'ont consulté

Définir un middleware différent pour les sous-routes dans go-chi

Dans go-chi, le framework Web du langage Go, la configuration de différents middlewares pour les sous-routes est une exigence courante. Le middleware est une fonction qui gère les requêtes et les réponses HTTP et peut effectuer certaines opérations supplémentaires avant et après que la requête atteigne le processeur cible. En définissant différents middlewares pour différents sous-itinéraires, nous pouvons personnaliser chaque sous-itinéraire en fonction des besoins de l'entreprise. Dans cet article, nous présenterons comment configurer de manière flexible différents middleware pour les sous-routes dans go-chi afin d'obtenir un traitement de routage plus flexible.

Contenu de la question

J'ai un serveur proxy qui peut être désactivé via la configuration, en utilisant mustBeSecure. Je veux que ce proxy se comporte différemment dans un certain sous-domaine : "/application/health", le rendant toujours dangereux. Tous les changements que j'ai essayés jusqu'à présent ont échoué. Existe-t-il un moyen de configurer un groupe différent pour « /application/health » qui utilise toujours le proxy mais ne nécessite jamais d'authentification ?

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)
Copier après la connexion

Comme demandé, voici un exemple de 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)
    })
}
Copier après la connexion

Solution de contournement

Je crois que vous essayez ceci.

  • Utilisez le routeur pour tous les /application itinéraires
  • Déclaration GET /health
  • Créez un groupe (en /application) pour tous les autres itinéraires
  • Appliquer un middleware conditionnel

Pour une compréhension plus facile, j'ai légèrement simplifié le code. Vous pouvez toujours utiliser la fonction setProxy.

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)
    }
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal