Menguruskan Pengendali Laluan HTTP secara Dinamik dalam Go
Apabila bekerja dengan pelayan HTTP dalam Go, adalah berfaedah untuk mempunyai fleksibiliti untuk mengubah suai secara dinamik pengendali laluan tanpa memulakan semula aplikasi. Artikel ini menyediakan penyelesaian untuk kedua-dua http.ServerMux asli dan mux.Router Gorilla Toolkit yang popular.
Secara tradisinya, satu pendekatan untuk mengurus laluan ialah mengendalikan ciri yang dilumpuhkan dengan mengembalikan kod status 404. Walau bagaimanapun, penyelesaian yang lebih umum melibatkan memintas permintaan masuk dan menyemak sama ada laluan didayakan pada masa ini.
Untuk tujuan ini, kami memperkenalkan jenis Pengendali, koleksi pengendali laluan dengan bendera didayakan yang berkaitan. Kaedah ServeHTTP mengendalikan permintaan masuk dengan menyemak bendera dan sama ada menggunakan pengendali atau mengembalikan ralat 404.
Kaedah HandleFunc mendaftarkan laluan dengan pemultipleks asas dan menambahkannya pada peta Pengendali. Apabila dipanggil kemudiannya, kaedah ini memastikan bahawa hanya pengendali yang didayakan dilaksanakan.
<code class="go">package main import ( "net/http" "sync" ) type HasHandleFunc interface { HandleFunc(pattern string, handler func(w http.ResponseWriter, req *http.Request)) } type Handler struct { http.HandlerFunc Enabled bool } type Handlers map[string]*Handler 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) } } func (h Handlers) HandleFunc(mux HasHandleFunc, pattern string, handler http.HandlerFunc) { h[pattern] = &Handler{handler, true} mux.HandleFunc(pattern, h.ServeHTTP) } func main() { 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 // the route to '/' is now disabled }) http.Handle("/", mux) http.ListenAndServe(":9020", nil) }</code>
Dengan penyelesaian ini, anda boleh melumpuhkan atau mendayakan laluan secara dinamik dan juga menyediakan corak penghalaan berasaskan masa, memenuhi keperluan untuk fleksibel Pengurusan laluan HTTP dalam Go.
Atas ialah kandungan terperinci Bagaimana untuk Menguruskan Pengendali Laluan HTTP secara Dinamik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!