Group Similar Routes in Go Echo

Using Echo groups is a great way to organize routes, especially when dealing with versioning, middleware, or related endpoints. Instead of cluttering the main file with multiple routes, you can logically group them. package main import ( "net/http" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" ) func main() { e := echo.New() // Global middleware e.Use(middleware.Logger()) e.Use(middleware.Recover()) // API versioning v1 := e.Group("/api/v1") // Group for user-related routes users := v1.Group("/users") users.GET("", getUsers) // GET /api/v1/users users.POST("", createUser) // POST /api/v1/users users.GET("/:id", getUserByID) // GET /api/v1/users/:id // Group for admin routes with middleware admin := v1.Group("/admin", adminMiddleware) admin.GET("/dashboard", adminDashboard) // GET /api/v1/admin/dashboard e.Logger.Fatal(e.Start(":8080")) } // Handlers func getUsers(c echo.Context) error { return c.JSON(http.StatusOK, map[string]string{"message": "List of users"}) } func createUser(c echo.Context) error { return c.JSON(http.StatusCreated, map[string]string{"message": "User created"}) } func getUserByID(c echo.Context) error { id := c.Param("id") return c.JSON(http.StatusOK, map[string]string{"message": "User ID: " + id}) } func adminDashboard(c echo.Context) error { return c.JSON(http.StatusOK, map[string]string{"message": "Admin dashboard"}) } // Middleware for admin routes func adminMiddleware(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { // Simulate an auth check if c.Request().Header.Get("Authorization") != "Bearer admin_token" { return c.JSON(http.StatusUnauthorized, map[string]string{"error": "Unauthorized"}) } return next(c) } }

April 6, 2025 · 1 min · 187 words · Saqib Razzaq

Request Logger Middleware in Go Echo

Middleware in Echo allows us to intercept requests before they reach handlers, making it a great place to add logging. Echo provides a built-in logging middleware (middleware.Logger()) but for more control, we can create a custom middleware: package main import ( "log" "time" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" ) // Custom logging middleware func requestLogger(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { start := time.Now() req := c.Request() log.Printf("Request: method=%s, path=%s, remote=%s", req.Method, req.URL.Path, req.RemoteAddr) err := next(c) res := c.Response() log.Printf("Response: status=%d, duration=%s", res.Status, time.Since(start)) return err } } func main() { e := echo.New() // Use Echo's default logger middleware e.Use(middleware.Logger()) // Use custom logging middleware e.Use(requestLogger) e.GET("/", func(c echo.Context) error { return c.String(200, "Hello, Echo!") }) e.Start(":8080") }

April 6, 2025 · 1 min · 119 words · Saqib Razzaq