Cara Menukar Pengendali Mux secara Dinamik dalam Pelayan HTTP Golang
In Go, http.ServeMux dan mux.Router Gorilla menyediakan alat serba boleh untuk pengendalian Laluan HTTP. Walau bagaimanapun, tiada mekanisme terbina dalam untuk mengubah suai fungsi pengendali yang dikaitkan dengan laluan sedia ada tanpa memulakan semula aplikasi.
Penyelesaian Kemungkinan:
Pilihan 1 : Pembalut Pengendali Tersuai dengan Bendera Dayakan/Lumpuhkan
Pendekatan ini melibatkan penciptaan jenis pengendali tersuai yang membenamkan fungsi pengendali sebenar dan termasuk bendera yang didayakan. Pengendali tersuai kemudiannya boleh ditambahkan pada mux, yang akan berfungsi kepada pengendali jika bendera ditetapkan kepada benar.
<code class="go">type Handler struct { http.HandlerFunc Enabled bool } type Handlers map[string]*Handler // Implementation of ServeHTTP that checks if the handler is enabled func (h Handlers) ServeHTTP(w http.ResponseWriter, r *http.Request) { path := r.URL.Path if handler, ok := h[path]; ok && handler.Enabled { handler.ServeHTTP(w, r) } else { http.Error(w, "Not Found", http.StatusNotFound) } }</code>
Kemudian, anda boleh menggunakan jenis pengendali tersuai ini dengan http.ServeMux atau gorilla/mux untuk mendayakan atau melumpuhkan laluan secara dinamik.
Contoh dengan http.ServeMux:
<code class="go">mux := http.NewServeMux() handlers := Handlers{} handlers.HandleFunc(mux, "/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("this will show once")) handlers["/"].Enabled = false }) http.Handle("/", mux)</code>
Pilihan 2: Middleware dengan Senarai Hitam URL
Sebagai alternatif, anda boleh melaksanakan perisian tengah yang menyemak URL yang diminta terhadap senarai laluan yang dilumpuhkan. Jika URL sepadan dengan laluan yang dilumpuhkan, perisian tengah boleh menghalang pelaksanaan pengendali dan mengembalikan respons tersuai.
Contoh:
<code class="go">func DisableRouteMiddleware(disabledRoutes []string) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { for _, route := range disabledRoutes { if r.URL.Path == route { http.Error(w, "Disabled", http.StatusNotFound) return } } next.ServeHTTP(w, r) }) } }</code>
Anda kemudian boleh menggunakan perisian tengah ini untuk membalut semua pengendali anda sebelum menambahkannya pada mux.
Kedua-dua pendekatan membolehkan anda melumpuhkan atau mendayakan laluan secara dinamik dalam aplikasi anda tanpa memerlukan dimulakan semula. Pilihan pilihan untuk digunakan bergantung pada keperluan khusus anda dan tahap fleksibiliti yang anda perlukan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengubah Pengendali Mux Secara Dinamik dalam Pelayan HTTP Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!