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

王林
Lepaskan: 2024-02-09 10:06:08
ke hadapan
750 orang telah melayarinya

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)
Salin selepas log masuk

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)
    })
}
Salin selepas log masuk

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)
    }
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan