Rumah >pembangunan bahagian belakang >Golang >Tetapkan perisian tengah yang berbeza untuk sub-laluan dalam go-chi

Tetapkan perisian tengah yang berbeza untuk sub-laluan dalam go-chi

王林
王林ke hadapan
2024-02-09 10:06:08738semak imbas

Tetapkan perisian tengah yang berbeza untuk sub-laluan dalam go-chi

Dalam go-chi, rangka kerja web bahasa Go, menetapkan perisian tengah yang berbeza untuk sub-laluan adalah keperluan biasa. Middleware ialah fungsi yang mengendalikan permintaan dan respons HTTP dan boleh melakukan beberapa operasi tambahan sebelum dan selepas permintaan mencapai pemproses sasaran. Dengan menetapkan perisian tengah yang berbeza untuk sub-laluan yang berbeza, kami boleh memperibadikan setiap sub-laluan mengikut keperluan perniagaan. Dalam artikel ini, kami akan memperkenalkan cara untuk menyediakan perisian tengah berbeza secara fleksibel untuk sub-laluan dalam go-chi untuk mencapai pemprosesan penghalaan yang lebih fleksibel.

Kandungan soalan

Saya mempunyai pelayan proksi yang boleh dinyahaktifkan melalui konfigurasi, menggunakan mustBeSecure. Saya mahu proksi ini berkelakuan berbeza dalam subdomain tertentu: "/application/health", menjadikannya sentiasa tidak selamat. Semua perubahan yang saya cuba setakat ini gagal. Adakah terdapat cara untuk mengkonfigurasi kumpulan lain untuk "/aplikasi/kesihatan" yang masih menggunakan proksi tetapi tidak memerlukan pengesahan?

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)

Seperti yang diminta, berikut ialah contoh 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)
    })
}

Penyelesaian

Saya percaya anda sedang mencuba ini.

  • Gunakan penghala untuk semua /application ​​laluan
  • Kenyataan GET /health
  • Buat kumpulan (dalam /application) untuk semua laluan lain
  • Gunakan middleware bersyarat

Untuk pemahaman yang lebih mudah, saya telah permudahkan sedikit kod. Anda masih boleh menggunakan fungsi 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)
    }
}

Atas ialah kandungan terperinci Tetapkan perisian tengah yang berbeza untuk sub-laluan dalam go-chi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam