Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida quanto o router.use()

Minha questão é, a posição no código influi nas rotas que o middleware opera? Por exemplo:

func HandleRequests() {
    r := mux.NewRouter()
    r.Use(middleware.ContentTypeMiddleware)
    r.HandleFunc("/", controllers.Home)
    r.HandleFunc("/api/personalidades", controllers.TodasPersonalidades).Methods("GET")
    r.HandleFunc("/api/personalidades/{id}", controllers.RetornaPersonalidade).Methods("GET")
    r.HandleFunc("/api/personalidades", controllers.NovaPersonalidade).Methods("POST")
    r.HandleFunc("/api/personalidades/{id}", controllers.DeletarPersonalidade).Methods("Delete")
    r.HandleFunc("/api/personalidades/{id}", controllers.EditarPersonalidade).Methods("PUT")
    log.Fatal(http.ListenAndServe(":8080", r))
}

No codigo acima, o middleware ficará disponivel para todas as rotas. Porem se eu colocar o r.Use(), mais para baixo, por exemplo:

func HandleRequests() {
    r := mux.NewRouter()
    r.HandleFunc("/", controllers.Home)
    r.HandleFunc("/api/personalidades", controllers.TodasPersonalidades).Methods("GET")
    r.HandleFunc("/api/personalidades/{id}", controllers.RetornaPersonalidade).Methods("GET")
    r.Use(middleware.ContentTypeMiddleware)
    r.HandleFunc("/api/personalidades", controllers.NovaPersonalidade).Methods("POST")
    r.HandleFunc("/api/personalidades/{id}", controllers.DeletarPersonalidade).Methods("Delete")
    r.HandleFunc("/api/personalidades/{id}", controllers.EditarPersonalidade).Methods("PUT")
    log.Fatal(http.ListenAndServe(":8080", r))
}

Somente as rotas abaixo dele vao ter acesso ao middleware? ou sua posi;áo na influi no go?

2 respostas
solução!

Olá, Mariana! Sua pergunta é muito pertinente e mostra que você está realmente se aprofundando no estudo do Go e do funcionamento dos middlewares.

A posição do middleware no código realmente influencia nas rotas que ele opera. No Go, os middlewares são executados na ordem em que são definidos e afetam todas as rotas que são definidas após eles.

No seu primeiro exemplo:

func HandleRequests() {
    r := mux.NewRouter()
    r.Use(middleware.ContentTypeMiddleware)
    r.HandleFunc("/", controllers.Home)
    r.HandleFunc("/api/personalidades", controllers.TodasPersonalidades).Methods("GET")
    r.HandleFunc("/api/personalidades/{id}", controllers.RetornaPersonalidade).Methods("GET")
    r.HandleFunc("/api/personalidades", controllers.NovaPersonalidade).Methods("POST")
    r.HandleFunc("/api/personalidades/{id}", controllers.DeletarPersonalidade).Methods("Delete")
    r.HandleFunc("/api/personalidades/{id}", controllers.EditarPersonalidade).Methods("PUT")
    log.Fatal(http.ListenAndServe(":8080", r))
}

O middleware ContentTypeMiddleware é aplicado a todas as rotas, pois ele é definido antes de todas as rotas.

No seu segundo exemplo:

func HandleRequests() {
    r := mux.NewRouter()
    r.HandleFunc("/", controllers.Home)
    r.HandleFunc("/api/personalidades", controllers.TodasPersonalidades).Methods("GET")
    r.HandleFunc("/api/personalidades/{id}", controllers.RetornaPersonalidade).Methods("GET")
    r.Use(middleware.ContentTypeMiddleware)
    r.HandleFunc("/api/personalidades", controllers.NovaPersonalidade).Methods("POST")
    r.HandleFunc("/api/personalidades/{id}", controllers.DeletarPersonalidade).Methods("Delete")
    r.HandleFunc("/api/personalidades/{id}", controllers.EditarPersonalidade).Methods("PUT")
    log.Fatal(http.ListenAndServe(":8080", r))
}

O middleware ContentTypeMiddleware só é aplicado às rotas que são definidas após ele. Ou seja, as rotas "/", "/api/personalidades" (GET) e "/api/personalidades/{id}" (GET) não terão o middleware aplicado, enquanto as rotas "/api/personalidades" (POST), "/api/personalidades/{id}" (DELETE) e "/api/personalidades/{id}" (PUT) terão o middleware aplicado.

Espero ter ajudado e bons estudos!

Opa, Ajudou demais Renan! Obrigada

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software