Pular para o conteúdo

Usando middleware

Middleware no Gin são funções que executam antes (e opcionalmente depois) do seu handler de rota. São usados para preocupações transversais como logging, autenticação, recuperação de erros e modificação de requisições.

O Gin suporta três níveis de anexação de middleware:

  • Middleware global — Aplicado a todas as rotas no roteador. Registrado com router.Use(). Bom para preocupações como logging e recuperação de panic que se aplicam universalmente.
  • Middleware de grupo — Aplicado a todas as rotas dentro de um grupo de rotas. Registrado com group.Use(). Útil para aplicar autenticação ou autorização a um subconjunto de rotas (ex.: todas as rotas /admin/*).
  • Middleware por rota — Aplicado a uma única rota apenas. Passado como argumentos adicionais para router.GET(), router.POST(), etc. Útil para lógica específica de rota como rate limiting customizado ou validação de entrada.

Ordem de execução: As funções middleware executam na ordem em que são registradas. Quando um middleware chama c.Next(), ele passa o controle para o próximo middleware (ou handler final), e então retoma a execução após o retorno de c.Next(). Isso cria um padrão de pilha (LIFO) — o primeiro middleware registrado é o primeiro a iniciar mas o último a terminar. Se um middleware não chama c.Next(), os middlewares subsequentes e o handler são pulados (útil para curto-circuito com c.Abort()).

package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// Creates a router without any middleware by default
router := gin.New()
// Global middleware
// Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release.
// By default gin.DefaultWriter = os.Stdout
router.Use(gin.Logger())
// Recovery middleware recovers from any panics and writes a 500 if there was one.
router.Use(gin.Recovery())
// Per route middleware, you can add as many as you desire.
router.GET("/benchmark", MyBenchLogger(), benchEndpoint)
// Authorization group
// authorized := router.Group("/", AuthRequired())
// exactly the same as:
authorized := router.Group("/")
// per group middleware! in this case we use the custom created
// AuthRequired() middleware just in the "authorized" group.
authorized.Use(AuthRequired())
{
authorized.POST("/login", loginEndpoint)
authorized.POST("/submit", submitEndpoint)
authorized.POST("/read", readEndpoint)
// nested group
testing := authorized.Group("testing")
testing.GET("/analytics", analyticsEndpoint)
}
// Listen and serve on 0.0.0.0:8080
router.Run(":8080")
}