我是Go的新手,并且无法找到任何关于此的信息,也许此时此刻不可能。
我试图删除或替换多路复用路由(使用http.NewServeMux或gorilla的mux.Router)。我的最终目标是能够启用/禁用路由或路由集,而无需重新启动程序。
我可以在处理程序基础上完成此操作,如果该功能被“禁用”,则返回404,但我宁愿找到更通用的方法来执行此操作,因为我想为我的应用程序中的每个路由实现它。
或者我会更好地跟踪禁用的url模式并使用一些中间件来阻止处理程序执行?
如果有人能够至少指出我正确的方向,我绝对会发布解决方案的代码示例,假设有一个。谢谢!
没有内置的方法,但很容易实现play。
type HasHandleFunc interface { //this is just so it would work for gorilla and http.ServerMux
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
})
http.Handle("/", mux)
http.ListenAndServe(":9020", nil)
}
是的你可以。
一种方法是使用http.Handle
方法实现ServeHTTP
接口的sturct。然后让struct包含另一个像gorilla这样的muxer,最后有一个原子Switch来启用/禁用子路由
这是我的意思的一个工作示例:
package main
import (
"fmt"
"github.com/gorilla/mux"
"net/http"
"sync/atomic"
)
var recording int32
func isRecording() bool {
return atomic.LoadInt32(&recording) != 0
}
func setRecording(shouldRecord bool) {
if shouldRecord {
atomic.StoreInt32(&recording, 1)
} else {
atomic.StoreInt32(&recording, 0)
}
}
type SwitchHandler struct {
mux http.Handler
}
func (s *SwitchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if isRecording() {
fmt.Printf("Switch Handler is Recording\n")
s.mux.ServeHTTP(w, r)
return
}
fmt.Printf("Switch Handler is NOT Recording\n")
w.WriteHeader(http.StatusNotFound)
fmt.Fprintf(w, "NOT Recording\n")
}
func main() {
router := mux.NewRouter()
router.HandleFunc("/success/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Recording\n")
})
handler := &SwitchHandler{mux: router}
setRecording(false)
http.Handle("/", handler)
http.ListenAndServe(":8080", nil)
}
根据https://github.com/gorilla/mux/issues/82,建议交换路由器而不是删除路由。现有连接将保持打开状态。