快速开始#
依赖引入#
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//返回所有已注册处理程序的数量
|