Как в go gorilla mux присвоить middleware оброботчик только одному хэндлеру?
Как в go gorilla mux присвоить middleware оброботчик только одному хэндлеру?
func (s *server) configureRouter(){
s.router.HandleFunc("/signup", s.handleSignUp()).Methods("POST")
s.router.HandleFunc("/signin", s.handleSignIn()).Methods("POST")
s.router.HandleFunc("/profile/{id:[0-9]+}", s.handleCreateProfile()).Methods("POST")
s.router.Use(s.authenticateUser)
}
Есть вот такая картина, как сделать так, чтоб authenticateUser вызывался только с "/profile/{id:[0-9]+}"?
Ответы (1 шт):
Автор решения: Senior Pomidor
→ Ссылка
нужно создавать Subrouter от главного роутера. вешать на него хэндлер и MiddlewareFunc
в вашем случае получится как
func (s *server) configureRouter(){
s.router.HandleFunc("/signup", s.handleSignUp()).Methods("POST")
s.router.HandleFunc("/signin", s.handleSignIn()).Methods("POST")
subrouter := s.router.HandleFunc("/profile/{id:[0-9]+}", s.handleCreateProfile()).Subrouter()
subrouter.Use(s.authenticateUser)
subrouter.Methods("POST")
}
тестовый пример
func main() {
router := mux.NewRouter()
router.HandleFunc("/signup", func(http.ResponseWriter, *http.Request) {
println("signup")
}).Methods("POST")
router.HandleFunc("/signin", func(http.ResponseWriter, *http.Request) {
println("signin")
}).Methods("POST")
subrouter := router.HandleFunc("/profile", func(w http.ResponseWriter, r *http.Request) {
println("42")
}).Subrouter()
subrouter.Use(func(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("custom message"))
})
})
subrouter.Methods("POST")
srv := &http.Server{
Handler: router,
Addr: "127.0.0.1:8000",
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}
log.Fatal(srv.ListenAndServe())
}