全书目录

第三十三篇:Fiber 完全指南 —— 极简高压快线城区宇宙

第五章:路由系统 —— 匝道、分流牌、路口优先级

2 分钟 584 字 第 616 / 962 个阅读单元

Fiber 的路由系统非常像快线城区的匝道牌。

先看几个基本例子:

go
app.Get("/health", func(c fiber.Ctx) error {
    return c.SendString("ok")
})

app.Get("/users/:id", func(c fiber.Ctx) error {
    id := c.Params("id")
    return c.JSON(fiber.Map{"id": id})
})

app.Get("/files/*", func(c fiber.Ctx) error {
    return c.SendString(c.Params("*"))
})

app.Get("/:name?", func(c fiber.Ctx) error {
    name := c.Params("name")
    if name == "" {
        return c.SendString("no name")
    }
    return c.SendString("hello " + name)
})

你可以把它们理解成:

  • /health:固定收费站
  • /users/:id:带动态车牌识别的收费站
  • /files/*:吃掉后面整段路径的总匝道
  • :name?:可选路口

#1. 路由顺序真的会影响结果

Fiber 官方路由文档明确强调:按声明顺序依次检查。

所以:

go
app.Get("/:id", func(c fiber.Ctx) error {
    return c.SendString("dynamic")
})

app.Get("/me", func(c fiber.Ctx) error {
    return c.SendString("fixed")
})

请求 /me 时,前面的 /:id 就可能先截走。

正确做法:

go
app.Get("/me", func(c fiber.Ctx) error {
    return c.SendString("fixed")
})

app.Get("/:id", func(c fiber.Ctx) error {
    return c.SendString("dynamic")
})

在快线城区里,这很好理解:

固定专用车道要先画,模糊的大匝道要后放。


#2. Group 不是实体楼,是“虚拟分区”
go
api := app.Group("/api")
v1 := api.Group("/v1")

v1.Get("/users", func(c fiber.Ctx) error {
    return c.SendString("user list")
})

实际效果是:

text
/api/v1/users

但你要注意一个 Fiber 很重要的点:

Group 是虚拟的,最终会展平成带前缀的路由,并按声明顺序执行。

也就是说,它更像“城市规划图上的分区”,不是一个真正独立运行的子系统。


#3. Group 前缀有边界规则

官方文档特别提醒:

  • /api 会匹配 /api
  • /api 会匹配 /api/v1
  • /api 不会匹配 /apiv1

这很重要,因为很多人会想当然地把它当“字符串前缀匹配”。

不是。

它更像“合法道路边界匹配”。


#4. Group 本身不自动有页面
go
api := app.Group("/api")
v1 := api.Group("/v1")

这不代表访问 /api/api/v1 就一定有响应。

如果你没给这些点位定义具体 handler,直接访问可能是 404

也就是:

分区图存在,不等于分区入口大厅已经建好。