👋 欢迎

这是一个带有示例的在线 API 文档,你可以立即开始使用 Fiber 构建 Web 应用!

Fiber 是一个受 Express 启发的 Web 框架,构建在 Fasthttp 之上,Fasthttp 是 Go 语言中最快的 HTTP 引擎。它的设计目的是为了简化开发流程,实现快速开发,同时考虑到零内存分配性能

本文档适用于 Fiber v2,该版本于 2020 年 9 月 15 日发布。


安装

首先,下载并安装 Go,版本需为 1.17 或更高。

使用 go get 命令进行安装:

  1. go get github.com/gofiber/fiber/v2

零内存分配

从 *fiber.Ctx 返回的一些值默认不是不可变的。

因为 fiber 针对高性能进行了优化,从 fiber.Ctx 返回的值默认是可变的,并且在多个请求之间会被复用。因此你只能在 handler 内部使用 context 的值,不能保留任何引用。一旦你从 handler 返回,这些值就会被后续的请求复用,并且会发生变化。示例如下:

  1. func handler(c *fiber.Ctx) error {
  2. // 这个变量只在当前 handler 中有效
  3. result := c.Params("foo")
  4. // ...
  5. }

如果你需要在 handler 外部持久化这些值,应该使用 copy 内建函数复制它们的底层 buffer。例如:

  1. func handler(c *fiber.Ctx) error {
  2. // 这个变量只在当前 handler 中有效
  3. result := c.Params("foo")
  4. // 复制内容
  5. buffer := make([]byte, len(result))
  6. copy(buffer, result)
  7. resultCopy := string(buffer)
  8. // 现在这个变量可以永久使用
  9. // ...
  10. }

我们还封装了一个名为 CopyString 的函数,功能就是做这件事,放在了 gofiber/utils 里。

  1. app.Get("/:foo", func(c *fiber.Ctx) error {
  2. // 变量现在是不可变的
  3. result := utils.CopyString(c.Params("foo"))
  4. // ...
  5. })

另外,你也可以启用 Immutable 配置,它会让 context 返回的所有值变成不可变的,这样就可以随意持久化使用了。当然,这样做会牺牲一些性能。

  1. app := fiber.New(fiber.Config{
  2. Immutable: true,
  3. })

更多细节可以参考 #426#185


Hello, World​

下面是一个最基础的 Fiber 应用:

  1. package main
  2. import "github.com/gofiber/fiber/v2"
  3. func main() {
  4. app := fiber.New()
  5. app.Get("/", func(c *fiber.Ctx) error {
  6. return c.SendString("Hello, World!")
  7. })
  8. app.Listen(":3000")
  9. }
  1. go run server.go

然后打开浏览器访问 http://localhost:3000,你应该能看到页面上显示了 Hello, World!


基本路由

路由是指应用如何响应来自客户端的请求,每个请求都会指向一个特定的端点,也就是一个 URI(路径)和一个 HTTP 请求方法(如 GET, PUT, POST 等)。

每个路由可以绑定多个 handler 函数,当匹配该路由时这些函数会依次执行。

定义路由的方式如下:

  1. // 函数签名
  2. app.Method(path string, ...func(*fiber.Ctx) error)
  • appFiber 的实例
  • Method 是一个 HTTP 请求方法:如 GET, PUT, POST
  • path 是服务器上的虚拟路径
  • func(*fiber.Ctx) error 是当路由匹配时被执行的回调函数,参数是 Context

简单路由

  1. // 在根路径 "/" 上返回 "Hello, World!"
  2. app.Get("/", func(c *fiber.Ctx) error {
  3. return c.SendString("Hello, World!")
  4. })

带参数

  1. // GET http://localhost:8080/hello%20world
  2. app.Get("/:value", func(c *fiber.Ctx) error {
  3. return c.SendString("value: " + c.Params("value"))
  4. // => 请求结果: value: hello world
  5. })

可选参数

  1. // GET http://localhost:3000/john
  2. app.Get("/:name?", func(c *fiber.Ctx) error {
  3. if c.Params("name") != "" {
  4. return c.SendString("Hello " + c.Params("name"))
  5. // => Hello john
  6. }
  7. return c.SendString("Where is john?")
  8. })

通配符

  1. // GET http://localhost:3000/api/user/john
  2. app.Get("/api/*", func(c *fiber.Ctx) error {
  3. return c.SendString("API path: " + c.Params("*"))
  4. // => API path: user/john
  5. })

静态文件

要提供静态文件(比如 图片CSSJavaScript 文件),可以用目录路径来代替 handler 函数。

函数签名如下:

  1. app.Static(prefix, root string, config ...Static)

下面这段代码会提供 ./public 目录中的文件:

  1. app := fiber.New()
  2. app.Static("/", "./public")
  3. app.Listen(":3000")

现在你就可以访问 ./public 目录中的文件了,例如:

  1. http://localhost:3000/hello.html
  2. http://localhost:3000/js/jquery.js
  3. http://localhost:3000/css/style.css

注意事项

如果你想了解更多如何使用 Go 和 Fiber 构建 API,可以参考这篇很棒的文章:用 Fiber 构建 Express 风格的 API