🚀 App

Static

使用 Static 方法可以用来提供静态文件服务,比如 图片 (images)CSSJavaScript 文件。

info
默认情况下,Static 会在请求某个目录时自动返回 index.html 文件。

方法签名:

  1. func (app *App) Static(prefix, root string, config ...Static) Router

如果你想提供一个叫 ./public 的目录里的文件,可以用下面的代码:

  1. app.Static("/", "./public")
  2. // => http://localhost:3000/hello.html
  3. // => http://localhost:3000/js/jquery.js
  4. // => http://localhost:3000/css/style.css

示例:

  1. // 提供多个目录的静态文件
  2. app.Static("/", "./public")
  3. // 提供 "./files" 目录的文件
  4. app.Static("/", "./files")

你可以为静态文件服务设置一个虚拟路径前缀(也就是这个路径在文件系统里并不存在),像这样:

示例:

  1. app.Static("/static", "./public")
  2. // => http://localhost:3000/static/hello.html
  3. // => http://localhost:3000/static/js/jquery.js
  4. // => http://localhost:3000/static/css/style.css

如果你想对静态文件服务做更多设置,可以使用 fiber.Static 结构体开启自定义配置。

fiber.Static{} 配置项:

  1. // Static 定义了提供静态资源服务时的配置选项。
  2. type Static struct {
  3. // 开启后会缓存压缩后的文件,减少 CPU 使用率,
  4. // 和 github.com/gofiber/compression 中间件不一样。
  5. Compress bool `json:"compress"` // 可选,默认 false
  6. // 开启后支持 Byte-Range 请求。
  7. ByteRange bool `json:"byte_range"` // 可选,默认 false
  8. // 开启目录浏览功能。
  9. Browse bool `json:"browse"` // 可选,默认 false
  10. // 开启后直接下载文件。
  11. Download bool `json:"download"` // 可选,默认 false
  12. // 设置目录的 index 文件名,默认是 "index.html"
  13. Index string `json:"index"`
  14. // 设置非活跃文件 handler 的过期时间。
  15. // 使用负数表示禁用缓存。
  16. CacheDuration time.Duration `json:"cache_duration"`
  17. // 设置 Cache-Control HTTP 头的 MaxAge,单位为秒。
  18. MaxAge int `json:"max_age"`
  19. // 修改响应的函数。
  20. ModifyResponse Handler
  21. // 设置跳过这个中间件的函数,返回 true 时跳过。
  22. Next func(c *Ctx) bool
  23. }

示例:

  1. // 自定义配置示例
  2. app.Static("/", "./public", fiber.Static{
  3. Compress: true,
  4. ByteRange: true,
  5. Browse: true,
  6. Index: "john.html",
  7. CacheDuration: 10 * time.Second,
  8. MaxAge: 3600,
  9. })

Route Handlers

用来注册某个特定 HTTP method 的路由。

方法签名:

  1. // 常见的 HTTP 方法
  2. func (app *App) Get(path string, handlers ...Handler) Router
  3. func (app *App) Head(path string, handlers ...Handler) Router
  4. func (app *App) Post(path string, handlers ...Handler) Router
  5. func (app *App) Put(path string, handlers ...Handler) Router
  6. func (app *App) Delete(path string, handlers ...Handler) Router
  7. func (app *App) Connect(path string, handlers ...Handler) Router
  8. func (app *App) Options(path string, handlers ...Handler) Router
  9. func (app *App) Trace(path string, handlers ...Handler) Router
  10. func (app *App) Patch(path string, handlers ...Handler) Router
  11. // 指定 method 注册路由
  12. func (app *App) Add(method, path string, handlers ...Handler) Router
  13. // 注册所有方法的路由
  14. // 类似 app.Use,但不会绑定到前缀
  15. func (app *App) All(path string, handlers ...Handler) Router

示例:

  1. // 简单的 GET handler
  2. app.Get("/api/list", func(c *fiber.Ctx) error {
  3. return c.SendString("I'm a GET request!")
  4. })
  5. // 简单的 POST handler
  6. app.Post("/api/register", func(c *fiber.Ctx) error {
  7. return c.SendString("I'm a POST request!")
  8. })

Use 方法用于中间件包和路径前缀的捕获。这些路由只会匹配路径的开头部分,比如 /john 会匹配 /john/doe/johnnnnn 等。

方法签名:

  1. func (app *App) Use(args ...interface{}) Router

示例:

  1. // 匹配所有请求
  2. app.Use(func(c *fiber.Ctx) error {
  3. return c.Next()
  4. })
  5. // 匹配以 /api 开头的请求
  6. app.Use("/api", func(c *fiber.Ctx) error {
  7. return c.Next()
  8. })
  9. // 同时匹配 /api 和 /home 开头的请求
  10. app.Use([]string{"/api", "/home"}, func(c *fiber.Ctx) error {
  11. return c.Next()
  12. })
  13. // 注册多个 handler
  14. app.Use("/api", func(c *fiber.Ctx) error {
  15. c.Set("X-Custom-Header", random.String(32))
  16. return c.Next()
  17. }, func(c *fiber.Ctx) error {
  18. return c.Next()
  19. })

Mount

你可以通过创建一个 *Mount 实例,把另一个 Fiber 应用挂载进去。

方法签名:

  1. func (a *App) Mount(prefix string, app *App) Router

示例:

  1. func main() {
  2. app := fiber.New()
  3. micro := fiber.New()
  4. app.Mount("/john", micro) // GET /john/doe -> 200 OK
  5. micro.Get("/doe", func(c *fiber.Ctx) error {
  6. return c.SendStatus(fiber.StatusOK)
  7. })
  8. log.Fatal(app.Listen(":3000"))
  9. }

MountPath

MountPath 属性会返回当前子应用被挂载的完整路径。

方法签名:

  1. func (app *App) MountPath() string

示例:

  1. func main() {
  2. app := fiber.New()
  3. one := fiber.New()
  4. two := fiber.New()
  5. three := fiber.New()
  6. two.Mount("/three", three)
  7. one.Mount("/two", two)
  8. app.Mount("/one", one)
  9. one.MountPath() // "/one"
  10. two.MountPath() // "/one/two"
  11. three.MountPath() // "/one/two/three"
  12. app.MountPath() // ""
  13. }

注意
MountPath 的顺序很重要,要从最深的 app 开始挂载才能获取到正确的路径。


Group

可以通过创建 *Group 对象来对路由进行分组。

方法签名:

  1. func (app *App) Group(prefix string, handlers ...Handler) Router

示例:

  1. func main() {
  2. app := fiber.New()
  3. api := app.Group("/api", handler) // /api
  4. v1 := api.Group("/v1", handler) // /api/v1
  5. v1.Get("/list", handler) // /api/v1/list
  6. v1.Get("/user", handler) // /api/v1/user
  7. v2 := api.Group("/v2", handler) // /api/v2
  8. v2.Get("/list", handler) // /api/v2/list
  9. v2.Get("/user", handler) // /api/v2/user
  10. log.Fatal(app.Listen(":3000"))
  11. }

Route

你可以使用 Route 方法在某个公共前缀下定义一组路由。

方法签名:

  1. func (app *App) Route(prefix string, fn func(router Router), name ...string) Router

示例:

  1. func main() {
  2. app := fiber.New()
  3. app.Route("/test", func(api fiber.Router) {
  4. api.Get("/foo", handler).Name("foo") // /test/foo (name: test.foo)
  5. api.Get("/bar", handler).Name("bar") // /test/bar (name: test.bar)
  6. }, "test.")
  7. log.Fatal(app.Listen(":3000"))
  8. }

Server

Server 返回底层的 fasthttp server

方法签名:

  1. func (app *App) Server() *fasthttp.Server

示例:

  1. func main() {
  2. app := fiber.New()
  3. app.Server().MaxConnsPerIP = 1
  4. // ...
  5. }

Server Shutdown

Shutdown 可以优雅地关闭服务器,不会中断当前活跃的连接。

ShutdownWithTimeout 会在指定时间后强制关闭所有连接。

ShutdownWithContext 会根据 context 的超时设置来决定是否强制关闭。

  1. func (app *App) Shutdown() error
  2. func (app *App) ShutdownWithTimeout(timeout time.Duration) error
  3. func (app *App) ShutdownWithContext(ctx context.Context) error

HandlersCount

返回注册的 handler 数量。

方法签名:

  1. func (app *App) HandlersCount() uint32

Stack

返回原始的路由栈。

方法签名:

  1. func (app *App) Stack() [][]*Route

示例:

  1. var handler = func(c *fiber.Ctx) error { return nil }
  2. func main() {
  3. app := fiber.New()
  4. app.Get("/john/:age", handler)
  5. app.Post("/register", handler)
  6. data, _ := json.MarshalIndent(app.Stack(), "", " ")
  7. fmt.Println(string(data))
  8. app.Listen(":3000")
  9. }

Name

为最近创建的路由设置名称。

方法签名:

  1. func (app *App) Name(name string) Router

GetRoute

根据名称获取路由对象。

方法签名:

  1. func (app *App) GetRoute(name string) Route

GetRoutes

作用:获取所有注册的路由。

  1. func (app *App) GetRoutes(filterUseOption ...bool) []Route
  • filterUseOptiontrue 时,会过滤掉由中间件注册的路由。

示例

  1. app := fiber.New()
  2. app.Post("/", func (c *fiber.Ctx) error {
  3. return c.SendString("Hello, World!")
  4. }).Name("index")
  5. data, _ := json.MarshalIndent(app.GetRoutes(true), "", " ")
  6. fmt.Print(string(data))

输出

  1. [
  2. {
  3. "method": "POST",
  4. "name": "index",
  5. "path": "/",
  6. "params": null
  7. }
  8. ]

Config

作用:返回应用的配置(只读)。

  1. func (app *App) Config() Config

Handler

作用:返回 fasthttp 兼容的 Handler,用来自定义处理请求。

  1. func (app *App) Handler() fasthttp.RequestHandler

Listen

作用:监听指定地址的 HTTP 请求。

  1. func (app *App) Listen(addr string) error

示例

  1. app.Listen(":8080")
  2. app.Listen("127.0.0.1:8080")

ListenTLS

作用:使用 TLS 证书和私钥监听 HTTPS 请求。

  1. func (app *App) ListenTLS(addr, certFile, keyFile string) error

默认 TLS 配置

  1. &tls.Config{
  2. MinVersion: tls.VersionTLS12,
  3. Certificates: []tls.Certificate{cert},
  4. }

ListenTLSWithCertificate

作用:直接使用 tls.Certificate 对象监听 HTTPS。

  1. func (app *App) ListenTLS(addr string, cert tls.Certificate) error

ListenMutualTLS

作用:启用双向 TLS 验证,使用服务器证书 + 客户端 CA 验证。

  1. func (app *App) ListenMutualTLS(addr, certFile, keyFile, clientCertFile string) error

默认配置

  1. &tls.Config{
  2. MinVersion: tls.VersionTLS12,
  3. ClientAuth: tls.RequireAndVerifyClientCert,
  4. ClientCAs: clientCertPool,
  5. Certificates: []tls.Certificate{cert},
  6. }

ListenMutualTLSWithCertificate

作用:直接用 tls.Certificate*x509.CertPool 启动双向认证。

  1. func (app *App) ListenMutualTLSWithCertificate(addr string, cert tls.Certificate, clientCertPool *x509.CertPool) error

Listener

作用:使用你自定义的 net.Listener 监听(可用于完全自定义 TLS 设置)。

  1. func (app *App) Listener(ln net.Listener) error

示例

  1. ln, _ := net.Listen("tcp", ":3000")
  2. cer, _ := tls.LoadX509KeyPair("server.crt", "server.key")
  3. ln = tls.NewListener(ln, &tls.Config{
  4. Certificates: []tls.Certificate{cer},
  5. })
  6. app.Listener(ln)

Test

作用:测试 HTTP 路由和响应。可用于单元测试或调试。

  1. func (app *App) Test(req *http.Request, msTimeout ...int) (*http.Response, error)

示例

  1. app.Get("/", func(c *fiber.Ctx) error {
  2. return c.SendString("hello, World!")
  3. })
  4. req := httptest.NewRequest("GET", "http://localhost/", nil)
  5. resp, _ := app.Test(req)

Hooks

作用:返回 Fiber 应用的 Hook 配置(生命周期钩子)。

  1. func (app *App) Hooks() *Hooks