快速开始

依赖引入

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

零分配

在Fiber中,*fiber.ctx是可变的,因此ctx只能在处理程序中使用,且不可以保留任何引用。

1
2
3
4
func handler(c *fiber.Ctx) error {
     //变量仅在此处理程序中有效
    result := c.Params("foo")
}

如果需要持久化存储,请使用copy()构建底层缓冲区副本。

1
2
3
4
5
6
7
8
9
func handler(c *fiber.Ctx) error {
     //变量仅在此处理程序中有效
    result := c.Params("foo")

     //制作副本
    buffer := make([]byte, len(result))
    copy(buffer, result)
    resultCopy := string(buffer)
}

也可以使用ImmutableString函数直接变量拷贝

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

    // ...
})

Hello World

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

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

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

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

  app.Listen(":3000")
}

Fiber包

New

创建一个新的 App 命名实例并传递可选配置

func New(config …Config) *App

1
2
// 默认配置
app := fiber.New()

Config

1
2
3
4
5
6
7
8
//自定义配置
app := fiber.New(fiber.Config{
    Prefork:       true,
    CaseSensitive: true,
    StrictRouting: true,
    ServerHeader:  "Fiber",
    AppName: "Test App v1.0.1"
})

NewError

1
2
3
app.Get("/", func(c *fiber.Ctx) error {
return fiber.NewError(782, "自定义错误消息")
})

IsChild

检查当前进程是否为子进程

1
2
3
4
5
6
7
8
9
app := fiber.New(fiber.Config{
    Prefork: true,//开启预分叉
})

if !fiber.IsChild() {
    fmt.Println("我是父进程")
} else {
    fmt.Println("我是子进程")
}

App包

静态文件

app.Static(prefix, root string)

如:使用./public作为目录名

1
2
app.Static("/", "./public")//访问路径为/
app.Static("/static", "./public")//访问路径为/static

路由

基本路由

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

参数路由

固定参数

1
2
3
4
app.Get("/:value", func(c *fiber.Ctx) error {
  return c.SendString("value: " + c.Params("value"))
  // => Get request with value: hello world
})

可选参数

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

通配符

1
2
3
app.Get("/api/*", func(c *fiber.Ctx) error {
  return c.SendString("API path: " + c.Params("*"))
})

自定义方法路由

1
2
func (app *App) Add(method, path string, handlers ...Handler) Router //第一个参数为请求方法名,参数为大写字母
func (app *App) All(path string, handlers ...Handler) Router //应用于所有方法路由

前缀捕获器

Use 可用于中间件包和前缀捕获器。这些路由将只匹配每条路径的开头,即 /john 将匹配 /john/doe、/johnnnnn 等

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//匹配所有请求
app.Use(func(c *fiber.Ctx) error {
    return c.Next()
})

//匹配 /api开头的请求
app.Use("/api", func(c *fiber.Ctx) error {
    return c.Next()
})

//匹配 /api和/home开头的请求
app.Use([]string{"/api", "/home"}, func(c *fiber.Ctx) error {
    return c.Next()
})

挂载

挂载实例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func main() {
    app := fiber.New()
    micro := fiber.New()
    app.Mount("/john", micro) // GET /john/doe -> 200 OK

    micro.Get("/doe", func(c *fiber.Ctx) error {
        return c.SendStatus(fiber.StatusOK)
    })

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

挂载路径

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func main() {
	app := fiber.New()
	one := fiber.New()
	two := fiber.New()
	three := fiber.New()

	two.Mount("/three", three)
	one.Mount("/two", two)
	app.Mount("/one", one)
  
	one.MountPath()   // "/one"
	two.MountPath()   // "/one/two"
	three.MountPath() // "/one/two/three"
	app.MountPath()   // ""
}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func main() {
  app := fiber.New()

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

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

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

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

公共前缀路由

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func main() {
  app := fiber.New()

  app.Route("/test", func(api fiber.Router) {
      api.Get("/foo", handler).Name("foo") // /test/foo (name: test.foo)
      api.Get("/bar", handler).Name("bar") // /test/bar (name: test.bar)
  }, "test.")

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

服务器

获取实例

1
2
3
4
5
6
7
func main() {
    app := fiber.New()

    app.Server().MaxConnsPerIP = 1

    // ...
}

服务器关闭

1
2
3
func (app *App) Shutdown() error// 优雅的关闭服务器
func (app *App) ShutdownWithTimeout(timeout time.Duration) error//时间到期后强制关闭服务器
func (app *App) ShutdownWithContext(ctx context.Context) error// 通过上下文关闭服务器

处理器计数

1
func (app *App) HandlersCount() uint32//返回所有已注册处理程序的数量