路由分组 #

一、路由分组概述 #

1.1 什么是路由分组 #

路由分组是将相关路由组织在一起的方式,可以共享公共的前缀、中间件等配置。

1.2 分组的优势 #

优势 说明
代码组织 按模块组织路由,结构清晰
中间件共享 分组内共享中间件
前缀管理 统一管理URL前缀
维护方便 易于修改和扩展

二、基本分组 #

2.1 创建分组 #

go
func main() {
    app := fiber.New()
    
    // 创建API分组
    api := app.Group("/api")
    
    // 在分组下定义路由
    api.Get("/users", func(c *fiber.Ctx) error {
        return c.SendString("Users API")
    })
    
    // 完整路径: /api/users
    
    app.Listen(":3000")
}

2.2 链式分组 #

go
func main() {
    app := fiber.New()
    
    // 链式创建分组
    app.Group("/api").
        Group("/v1").
        Get("/users", func(c *fiber.Ctx) error {
            return c.SendString("API v1 Users")
        })
    
    // 完整路径: /api/v1/users
    
    app.Listen(":3000")
}

2.3 分组变量 #

go
func main() {
    app := fiber.New()
    
    // 保存分组引用
    api := app.Group("/api")
    v1 := api.Group("/v1")
    users := v1.Group("/users")
    
    users.Get("/", listUsers)
    users.Get("/:id", getUser)
    users.Post("/", createUser)
    
    // 完整路径:
    // GET  /api/v1/users
    // GET  /api/v1/users/:id
    // POST /api/v1/users
    
    app.Listen(":3000")
}

三、分组中间件 #

3.1 分组级别中间件 #

go
func main() {
    app := fiber.New()
    
    // 分组中间件
    api := app.Group("/api", func(c *fiber.Ctx) error {
        c.Set("X-API-Version", "1.0")
        return c.Next()
    })
    
    api.Get("/users", func(c *fiber.Ctx) error {
        return c.SendString("Users")
    })
    
    // 所有/api下的路由都会执行中间件
    
    app.Listen(":3000")
}

3.2 多个中间件 #

go
func main() {
    app := fiber.New()
    
    // 多个中间件
    api := app.Group("/api",
        loggerMiddleware,
        authMiddleware,
        rateLimitMiddleware,
    )
    
    api.Get("/users", getUsers)
    
    app.Listen(":3000")
}

func loggerMiddleware(c *fiber.Ctx) error {
    log.Println("Request:", c.Path())
    return c.Next()
}

func authMiddleware(c *fiber.Ctx) error {
    token := c.Get("Authorization")
    if token == "" {
        return c.Status(401).JSON(fiber.Map{
            "error": "Unauthorized",
        })
    }
    return c.Next()
}

func rateLimitMiddleware(c *fiber.Ctx) error {
    // 限流逻辑
    return c.Next()
}

3.3 Use方法添加中间件 #

go
func main() {
    app := fiber.New()
    
    api := app.Group("/api")
    
    // 使用Use添加中间件
    api.Use(loggerMiddleware)
    api.Use(authMiddleware)
    
    api.Get("/users", getUsers)
    
    app.Listen(":3000")
}

四、嵌套分组 #

4.1 基本嵌套 #

go
func main() {
    app := fiber.New()
    
    api := app.Group("/api")
    
    // v1版本
    v1 := api.Group("/v1")
    v1.Get("/users", getUsersV1)
    v1.Get("/posts", getPostsV1)
    
    // v2版本
    v2 := api.Group("/v2")
    v2.Get("/users", getUsersV2)
    v2.Get("/posts", getPostsV2)
    
    // 完整路径:
    // /api/v1/users
    // /api/v1/posts
    // /api/v2/users
    // /api/v2/posts
    
    app.Listen(":3000")
}

4.2 深层嵌套 #

go
func main() {
    app := fiber.New()
    
    api := app.Group("/api")
    users := api.Group("/users")
    
    // 用户下的文章
    posts := users.Group("/:userId/posts")
    posts.Get("/", listUserPosts)
    posts.Get("/:postId", getUserPost)
    
    // 文章下的评论
    comments := posts.Group("/:postId/comments")
    comments.Get("/", listComments)
    comments.Post("/", createComment)
    
    // 完整路径:
    // GET  /api/users/:userId/posts
    // GET  /api/users/:userId/posts/:postId
    // GET  /api/users/:userId/posts/:postId/comments
    // POST /api/users/:userId/posts/:postId/comments
    
    app.Listen(":3000")
}

4.3 嵌套分组中间件 #

go
func main() {
    app := fiber.New()
    
    api := app.Group("/api", apiLogger)
    
    // 公开API
    public := api.Group("/public")
    public.Get("/info", getPublicInfo)
    
    // 认证API
    auth := api.Group("/auth", authMiddleware)
    auth.Get("/profile", getProfile)
    auth.Get("/settings", getSettings)
    
    // 管理员API
    admin := auth.Group("/admin", adminMiddleware)
    admin.Get("/users", listAllUsers)
    admin.Delete("/users/:id", deleteUser)
    
    // 中间件执行顺序:
    // /api/public/info        → apiLogger
    // /api/auth/profile       → apiLogger → authMiddleware
    // /api/auth/admin/users   → apiLogger → authMiddleware → adminMiddleware
    
    app.Listen(":3000")
}

五、路由模块化 #

5.1 模块化设计 #

go
// routes/api.go
package routes

import "github.com/gofiber/fiber/v2"

func SetupAPIRoutes(app *fiber.App) {
    api := app.Group("/api")
    
    SetupUserRoutes(api)
    SetupPostRoutes(api)
    SetupAuthRoutes(api)
}

// routes/user.go
package routes

import (
    "github.com/gofiber/fiber/v2"
    "myapp/handlers"
)

func SetupUserRoutes(api fiber.Router) {
    users := api.Group("/users")
    
    users.Get("/", handlers.ListUsers)
    users.Get("/:id", handlers.GetUser)
    users.Post("/", handlers.CreateUser)
    users.Put("/:id", handlers.UpdateUser)
    users.Delete("/:id", handlers.DeleteUser)
}

// routes/post.go
package routes

import (
    "github.com/gofiber/fiber/v2"
    "myapp/handlers"
)

func SetupPostRoutes(api fiber.Router) {
    posts := api.Group("/posts")
    
    posts.Get("/", handlers.ListPosts)
    posts.Get("/:id", handlers.GetPost)
    posts.Post("/", handlers.CreatePost)
    posts.Put("/:id", handlers.UpdatePost)
    posts.Delete("/:id", handlers.DeletePost)
}

// main.go
package main

import (
    "github.com/gofiber/fiber/v2"
    "myapp/routes"
)

func main() {
    app := fiber.New()
    
    routes.SetupAPIRoutes(app)
    
    app.Listen(":3000")
}

5.2 模块化注册 #

go
// routes/router.go
package routes

import "github.com/gofiber/fiber/v2"

type RouteModule interface {
    Register(fiber.Router)
}

func RegisterModules(app *fiber.App, modules []RouteModule) {
    api := app.Group("/api")
    
    for _, module := range modules {
        module.Register(api)
    }
}

// modules/user/module.go
package user

import "github.com/gofiber/fiber/v2"

type UserModule struct{}

func (m *UserModule) Register(r fiber.Router) {
    users := r.Group("/users")
    users.Get("/", m.List)
    users.Get("/:id", m.Get)
    users.Post("/", m.Create)
}

// main.go
package main

import (
    "github.com/gofiber/fiber/v2"
    "myapp/routes"
    "myapp/modules/user"
    "myapp/modules/post"
)

func main() {
    app := fiber.New()
    
    modules := []routes.RouteModule{
        &user.UserModule{},
        &post.PostModule{},
    }
    
    routes.RegisterModules(app, modules)
    
    app.Listen(":3000")
}

六、版本化API #

6.1 URL版本化 #

go
func main() {
    app := fiber.New()
    
    // v1版本
    v1 := app.Group("/api/v1")
    v1.Get("/users", getUsersV1)
    v1.Get("/posts", getPostsV1)
    
    // v2版本
    v2 := app.Group("/api/v2")
    v2.Get("/users", getUsersV2)
    v2.Get("/posts", getPostsV2)
    
    app.Listen(":3000")
}

6.2 Header版本化 #

go
func main() {
    app := fiber.New()
    
    api := app.Group("/api")
    
    // 版本中间件
    api.Use(func(c *fiber.Ctx) error {
        version := c.Get("API-Version", "v1")
        c.Locals("version", version)
        return c.Next()
    })
    
    api.Get("/users", func(c *fiber.Ctx) error {
        version := c.Locals("version").(string)
        switch version {
        case "v1":
            return getUsersV1(c)
        case "v2":
            return getUsersV2(c)
        default:
            return getUsersV1(c)
        }
    })
    
    app.Listen(":3000")
}

6.3 分组版本工厂 #

go
func main() {
    app := fiber.New()
    
    // 版本工厂
    versions := map[string]fiber.Router{
        "v1": app.Group("/api/v1"),
        "v2": app.Group("/api/v2"),
    }
    
    // 注册路由到各版本
    for _, v := range versions {
        v.Get("/users", getUsers)
        v.Get("/posts", getPosts)
    }
    
    // v1特有路由
    versions["v1"].Get("/legacy", legacyHandler)
    
    // v2特有路由
    versions["v2"].Get("/new-feature", newFeatureHandler)
    
    app.Listen(":3000")
}

七、分组配置 #

7.1 分组配置选项 #

go
func main() {
    app := fiber.New()
    
    // 带配置的分组
    api := app.Group("/api", fiber.RouterConfig{
        // 分组特定配置
    })
    
    api.Get("/users", getUsers)
    
    app.Listen(":3000")
}

7.2 分组前缀动态化 #

go
func main() {
    app := fiber.New()
    
    prefix := os.Getenv("API_PREFIX")
    if prefix == "" {
        prefix = "/api"
    }
    
    api := app.Group(prefix)
    api.Get("/users", getUsers)
    
    app.Listen(":3000")
}

八、实战示例 #

8.1 完整项目路由结构 #

go
// main.go
package main

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/logger"
    "github.com/gofiber/fiber/v2/middleware/recover"
    
    "myapp/routes"
)

func main() {
    app := fiber.New()
    
    // 全局中间件
    app.Use(logger.New())
    app.Use(recover.New())
    
    // 健康检查
    app.Get("/health", func(c *fiber.Ctx) error {
        return c.JSON(fiber.Map{"status": "ok"})
    })
    
    // 注册路由
    routes.Setup(app)
    
    app.Listen(":3000")
}

// routes/routes.go
package routes

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/cors"
    
    "myapp/handlers"
    "myapp/middleware"
)

func Setup(app *fiber.App) {
    // 静态文件
    app.Static("/static", "./public")
    
    // API路由
    api := app.Group("/api")
    
    // CORS
    api.Use(cors.New())
    
    // 公开路由
    public := api.Group("/public")
    public.Post("/register", handlers.Register)
    public.Post("/login", handlers.Login)
    
    // 认证路由
    auth := api.Group("/auth", middleware.JWTProtected)
    auth.Get("/profile", handlers.GetProfile)
    auth.Put("/profile", handlers.UpdateProfile)
    
    // 用户路由
    users := api.Group("/users", middleware.JWTProtected)
    users.Get("/", handlers.ListUsers)
    users.Get("/:id", handlers.GetUser)
    users.Put("/:id", handlers.UpdateUser)
    
    // 管理员路由
    admin := api.Group("/admin", middleware.JWTProtected, middleware.AdminOnly)
    admin.Get("/users", handlers.AdminListUsers)
    admin.Delete("/users/:id", handlers.AdminDeleteUser)
    admin.Get("/stats", handlers.AdminStats)
}

8.2 RESTful资源路由 #

go
// routes/resource.go
package routes

import "github.com/gofiber/fiber/v2"

type ResourceHandler interface {
    Index(c *fiber.Ctx) error
    Show(c *fiber.Ctx) error
    Store(c *fiber.Ctx) error
    Update(c *fiber.Ctx) error
    Destroy(c *fiber.Ctx) error
}

func Resource(r fiber.Router, path string, h ResourceHandler) {
    r.Get(path, h.Index)
    r.Get(path+"/:id", h.Show)
    r.Post(path, h.Store)
    r.Put(path+"/:id", h.Update)
    r.Delete(path+"/:id", h.Destroy)
}

// 使用
func main() {
    app := fiber.New()
    api := app.Group("/api")
    
    Resource(api, "/users", &UserHandler{})
    Resource(api, "/posts", &PostHandler{})
    
    app.Listen(":3000")
}

九、总结 #

9.1 核心要点 #

要点 说明
创建分组 app.Group(“/prefix”)
分组中间件 分组级别应用中间件
嵌套分组 支持多层嵌套
模块化 按模块组织路由
版本化 支持API版本管理

9.2 下一步 #

现在你已经掌握了路由分组,接下来让我们学习 HTTP方法,了解各种HTTP请求的处理!

最后更新:2026-03-28