Как в 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())
}
→ Ссылка