Search code examples
gomiddlewarego-gin

Gin and middleware


How to make a middleware so that it only works for some handlers (not for all)? For example,

func (srv *server) Router(repository storage.Repository, cfg config.Flags) *gin.Engine {
 h := handlers.NewHandlerProvider()
 m := middlewares.NewMiddlewareProvider()
 srv.httpServer.Use(gin.Recovery())
 srv.httpServer.Use(m.LogHTTPHandler())
 srv.httpServer.POST("/", FirstHandler)
 srv.httpServer.GET("/qwe", SecondHandler)
 return srv.httpServer
}

I just want m.LogHTTPHandler() to work only with FirstHandler, not both


Solution

  • Use gin.RouterGroup to group all the routes that have common middlewares:

    package main
    
    import (
        "fmt"
    
        "github.com/gin-gonic/gin"
    )
    
    func main() {
        // New returns a new blank Engine instance without any middleware attached.
        router := gin.New()
    
        g1 := router.Group("/")
        {
            // Add the logger middleware to group 1.
            g1.Use(gin.Logger())
    
            g1.GET("/", gin.HandlerFunc(func(ctx *gin.Context) {
                fmt.Println("FirstHandler")
            }))
        }
    
        g2 := router.Group("/qwe")
        {
            g2.GET("/", gin.HandlerFunc(func(ctx *gin.Context) {
                fmt.Println("/SecondHandler")
            }))
        }
    
        router.Run(":8080")
    }