路由

未匹配的标注

🔌 路由

路由指如何通过应用端点(URIs)给客户端响应请求。

路径

路径包含请求方法以及可以供请求的端点。路径可以是 字符串 或者 字符匹配模式

基于字符的路由实例

// 下面的路径将会匹配跟路由的请求, "/":
app.Get("/", func(c *fiber.Ctx) error {
      return c.SendString("root")
})

// 下面的路径将会匹配 "/about" 路由的请求:
app.Get("/about", func(c *fiber.Ctx) error {
    return c.SendString("about")
})

// 下面的路径将会匹配 "/random.txt" 路由的请求:
app.Get("/random.txt", func(c *fiber.Ctx) error {
    return c.SendString("random.txt")
})

参数

路由参数是路由中的动态元素,分为 命名参数未命名参数。参数段用于捕获 URL 中特定位置的值。可以使用 Params 函数获取,以路径中指定的路由参数名为键或对未命名参数而言,使用字符(*, +)获取。

字符 :,+,以及 * 是特别引入的参数字符

参数贪婪由通配符星号(*)或加号(+)表示。

路由还提供了可选参数的能力,对命名参数来讲,在其末尾标注上 “?” 即可,与加号不同,加号是必填的,你可以把通配符用于范围参数,该范围可选及贪婪。

带路由参数的路由实例

// 参数
app.Get("/user/:name/books/:title", func(c *fiber.Ctx) error {
    fmt.Fprintf(c, "%s\n", c.Params("name"))
    fmt.Fprintf(c, "%s\n", c.Params("title"))
    return nil
})
// 加号 - 贪婪 - 必填
app.Get("/user/+", func(c *fiber.Ctx) error {
    return c.SendString(c.Params("+"))
})

// 可选参数
app.Get("/user/:name?", func(c *fiber.Ctx) error {
    return c.SendString(c.Params("name"))
})

// 通配符 - 贪婪 - 可选
app.Get("/user/*", func(c *fiber.Ctx) error {
    return c.SendString(c.Params("*"))
})

// 如下路由将匹配 "/v1/some/resource/name:customVerb" 请求,因为参数符号被转义了
app.Get("/v1/some/resource/name\\:customVerb", func(c *fiber.Ctx) error {
    return c.SendString("Hello, Community")
})

提示:由于连字符(-)以及点字符(.)是按字面意思解释的,所以他们可以与路由参数一起使用,以达到目的。

提示:所有的特殊字符都会被"\\"转义从而失去其特殊意义,所以你可以在路由中依你所需去使用这些字符,比如实现这些自定义方法 谷歌 api 设计指引

// http://localhost:3000/plantae/prunus.persica
app.Get("/plantae/:genus.:species", func(c *fiber.Ctx) error {
    fmt.Fprintf(c, "%s.%s\n", c.Params("genus"), c.Params("species"))
    return nil // prunus.persica
})
// http://localhost:3000/flights/LAX-SFO
app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
    fmt.Fprintf(c, "%s-%s\n", c.Params("from"), c.Params("to"))
    return nil // LAX-SFO
})

我们的智能路由可以识别出介绍性的参数字符应该是请求路由的一部分,并且做出正确的处理,比如:

// http://localhost:3000/shop/product/color:blue/size:xs
app.Get("/shop/product/color::color/size::size", func(c *fiber.Ctx) error {
    fmt.Fprintf(c, "%s:%s\n", c.Params("color"), c.Params("size"))
    return nil // blue:xs
})

此外,可以在路由行内使用多个未命名参数,比如通配符或者加号,这会极大的扩展用户的路由多样性。

// GET /@v1
// Params: "sign" -> "@", "param" -> "v1"
app.Get("/:sign:param", handler)

// GET /api-v1
// Params: "name" -> "v1" 
app.Get("/api-:name", handler)

// GET /customer/v1/cart/proxy
// Params: "*1" -> "customer/", "*2" -> "/cart"
app.Get("/*v1*/proxy", handler)

// GET /v1/brand/4/shop/blue/xs
// Params: "*1" -> "brand/4", "*2" -> "blue/xs"
app.Get("/v1/*/shop/*", handler)

我们已对路由进行了大规模调整,但目前不会支持正则匹配,因为太慢了。这个特性可以在 0.1.7 版本(express 4)上进行测试,线上地址 Express 路由测试

中间件

中间件函数被设计用于对请求或响应进行更改。NextFiber 的路由函数,一旦调用,将会执行 下一个 匹配 当前路由的函数。

中间件函数的实例

app.Use(func(c *fiber.Ctx) error {
  // 设置一些安全相关的头信息:
  c.Set("X-XSS-Protection", "1; mode=block")
  c.Set("X-Content-Type-Options", "nosniff")
  c.Set("X-Download-Options", "noopen")
  c.Set("Strict-Transport-Security", "max-age=5184000")
  c.Set("X-Frame-Options", "SAMEORIGIN")
  c.Set("X-DNS-Prefetch-Control", "off")

  // 执行下一个中间件
  return c.Next()
})

app.Get("/", func(c *fiber.Ctx) error {
  return c.SendString("Hello, World!")
})

Use 方法的路径含义为 挂载 路径,或者 前缀 路径,并将中间件限制于仅此路径开头的任何请求。

分组

如果应用有很多访问端点,可使用 Group 来组织路由。

func main() {
  app := fiber.New()

  api := app.Group("/api", middleware) // /api

  v1 := api.Group("/v1", middleware)   // /api/v1
  v1.Get("/list", handler)             // /api/v1/list
  v1.Get("/user", handler)             // /api/v1/user

  v2 := api.Group("/v2", middleware)   // /api/v2
  v2.Get("/list", handler)             // /api/v2/list
  v2.Get("/user", handler)             // /api/v2/user

  log.Fatal(app.Listen(":3000"))
}

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/gofiber/2.x/rou...

译文地址:https://learnku.com/docs/gofiber/2.x/rou...

上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 查看所有版本


暂无话题~