🚀 App
Static
使用 Static 方法可以用来提供静态文件服务,比如 图片 (images)、CSS 和 JavaScript 文件。
info
默认情况下,Static 会在请求某个目录时自动返回index.html
文件。
方法签名:
func (app *App) Static(prefix, root string, config ...Static) Router
如果你想提供一个叫 ./public
的目录里的文件,可以用下面的代码:
app.Static("/", "./public")
// => http://localhost:3000/hello.html
// => http://localhost:3000/js/jquery.js
// => http://localhost:3000/css/style.css
示例:
// 提供多个目录的静态文件
app.Static("/", "./public")
// 提供 "./files" 目录的文件
app.Static("/", "./files")
你可以为静态文件服务设置一个虚拟路径前缀(也就是这个路径在文件系统里并不存在),像这样:
示例:
app.Static("/static", "./public")
// => http://localhost:3000/static/hello.html
// => http://localhost:3000/static/js/jquery.js
// => http://localhost:3000/static/css/style.css
如果你想对静态文件服务做更多设置,可以使用 fiber.Static
结构体开启自定义配置。
fiber.Static{} 配置项:
// Static 定义了提供静态资源服务时的配置选项。
type Static struct {
// 开启后会缓存压缩后的文件,减少 CPU 使用率,
// 和 github.com/gofiber/compression 中间件不一样。
Compress bool `json:"compress"` // 可选,默认 false
// 开启后支持 Byte-Range 请求。
ByteRange bool `json:"byte_range"` // 可选,默认 false
// 开启目录浏览功能。
Browse bool `json:"browse"` // 可选,默认 false
// 开启后直接下载文件。
Download bool `json:"download"` // 可选,默认 false
// 设置目录的 index 文件名,默认是 "index.html"
Index string `json:"index"`
// 设置非活跃文件 handler 的过期时间。
// 使用负数表示禁用缓存。
CacheDuration time.Duration `json:"cache_duration"`
// 设置 Cache-Control HTTP 头的 MaxAge,单位为秒。
MaxAge int `json:"max_age"`
// 修改响应的函数。
ModifyResponse Handler
// 设置跳过这个中间件的函数,返回 true 时跳过。
Next func(c *Ctx) bool
}
示例:
// 自定义配置示例
app.Static("/", "./public", fiber.Static{
Compress: true,
ByteRange: true,
Browse: true,
Index: "john.html",
CacheDuration: 10 * time.Second,
MaxAge: 3600,
})
Route Handlers
用来注册某个特定 HTTP method 的路由。
方法签名:
// 常见的 HTTP 方法
func (app *App) Get(path string, handlers ...Handler) Router
func (app *App) Head(path string, handlers ...Handler) Router
func (app *App) Post(path string, handlers ...Handler) Router
func (app *App) Put(path string, handlers ...Handler) Router
func (app *App) Delete(path string, handlers ...Handler) Router
func (app *App) Connect(path string, handlers ...Handler) Router
func (app *App) Options(path string, handlers ...Handler) Router
func (app *App) Trace(path string, handlers ...Handler) Router
func (app *App) Patch(path string, handlers ...Handler) Router
// 指定 method 注册路由
func (app *App) Add(method, path string, handlers ...Handler) Router
// 注册所有方法的路由
// 类似 app.Use,但不会绑定到前缀
func (app *App) All(path string, handlers ...Handler) Router
示例:
// 简单的 GET handler
app.Get("/api/list", func(c *fiber.Ctx) error {
return c.SendString("I'm a GET request!")
})
// 简单的 POST handler
app.Post("/api/register", func(c *fiber.Ctx) error {
return c.SendString("I'm a POST request!")
})
Use 方法用于中间件包和路径前缀的捕获。这些路由只会匹配路径的开头部分,比如 /john
会匹配 /john/doe
、/johnnnnn
等。
方法签名:
func (app *App) Use(args ...interface{}) Router
示例:
// 匹配所有请求
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()
})
// 注册多个 handler
app.Use("/api", func(c *fiber.Ctx) error {
c.Set("X-Custom-Header", random.String(32))
return c.Next()
}, func(c *fiber.Ctx) error {
return c.Next()
})
Mount
你可以通过创建一个 *Mount
实例,把另一个 Fiber 应用挂载进去。
方法签名:
func (a *App) Mount(prefix string, app *App) Router
示例:
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"))
}
MountPath
MountPath
属性会返回当前子应用被挂载的完整路径。
方法签名:
func (app *App) MountPath() string
示例:
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() // ""
}
注意
MountPath 的顺序很重要,要从最深的 app 开始挂载才能获取到正确的路径。
Group
可以通过创建 *Group
对象来对路由进行分组。
方法签名:
func (app *App) Group(prefix string, handlers ...Handler) Router
示例:
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"))
}
Route
你可以使用 Route
方法在某个公共前缀下定义一组路由。
方法签名:
func (app *App) Route(prefix string, fn func(router Router), name ...string) Router
示例:
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"))
}
Server
Server
返回底层的 fasthttp server。
方法签名:
func (app *App) Server() *fasthttp.Server
示例:
func main() {
app := fiber.New()
app.Server().MaxConnsPerIP = 1
// ...
}
Server Shutdown
Shutdown 可以优雅地关闭服务器,不会中断当前活跃的连接。
ShutdownWithTimeout
会在指定时间后强制关闭所有连接。
ShutdownWithContext
会根据 context 的超时设置来决定是否强制关闭。
func (app *App) Shutdown() error
func (app *App) ShutdownWithTimeout(timeout time.Duration) error
func (app *App) ShutdownWithContext(ctx context.Context) error
HandlersCount
返回注册的 handler 数量。
方法签名:
func (app *App) HandlersCount() uint32
Stack
返回原始的路由栈。
方法签名:
func (app *App) Stack() [][]*Route
示例:
var handler = func(c *fiber.Ctx) error { return nil }
func main() {
app := fiber.New()
app.Get("/john/:age", handler)
app.Post("/register", handler)
data, _ := json.MarshalIndent(app.Stack(), "", " ")
fmt.Println(string(data))
app.Listen(":3000")
}
Name
为最近创建的路由设置名称。
方法签名:
func (app *App) Name(name string) Router
GetRoute
根据名称获取路由对象。
方法签名:
func (app *App) GetRoute(name string) Route
✅ GetRoutes
作用:获取所有注册的路由。
func (app *App) GetRoutes(filterUseOption ...bool) []Route
filterUseOption
为true
时,会过滤掉由中间件注册的路由。
示例:
app := fiber.New()
app.Post("/", func (c *fiber.Ctx) error {
return c.SendString("Hello, World!")
}).Name("index")
data, _ := json.MarshalIndent(app.GetRoutes(true), "", " ")
fmt.Print(string(data))
输出:
[
{
"method": "POST",
"name": "index",
"path": "/",
"params": null
}
]
✅ Config
作用:返回应用的配置(只读)。
func (app *App) Config() Config
✅ Handler
作用:返回 fasthttp
兼容的 Handler,用来自定义处理请求。
func (app *App) Handler() fasthttp.RequestHandler
✅ Listen
作用:监听指定地址的 HTTP 请求。
func (app *App) Listen(addr string) error
示例:
app.Listen(":8080")
app.Listen("127.0.0.1:8080")
✅ ListenTLS
作用:使用 TLS 证书和私钥监听 HTTPS 请求。
func (app *App) ListenTLS(addr, certFile, keyFile string) error
默认 TLS 配置:
&tls.Config{
MinVersion: tls.VersionTLS12,
Certificates: []tls.Certificate{cert},
}
✅ ListenTLSWithCertificate
作用:直接使用 tls.Certificate
对象监听 HTTPS。
func (app *App) ListenTLS(addr string, cert tls.Certificate) error
✅ ListenMutualTLS
作用:启用双向 TLS 验证,使用服务器证书 + 客户端 CA 验证。
func (app *App) ListenMutualTLS(addr, certFile, keyFile, clientCertFile string) error
默认配置:
&tls.Config{
MinVersion: tls.VersionTLS12,
ClientAuth: tls.RequireAndVerifyClientCert,
ClientCAs: clientCertPool,
Certificates: []tls.Certificate{cert},
}
✅ ListenMutualTLSWithCertificate
作用:直接用 tls.Certificate
和 *x509.CertPool
启动双向认证。
func (app *App) ListenMutualTLSWithCertificate(addr string, cert tls.Certificate, clientCertPool *x509.CertPool) error
✅ Listener
作用:使用你自定义的 net.Listener
监听(可用于完全自定义 TLS 设置)。
func (app *App) Listener(ln net.Listener) error
示例:
ln, _ := net.Listen("tcp", ":3000")
cer, _ := tls.LoadX509KeyPair("server.crt", "server.key")
ln = tls.NewListener(ln, &tls.Config{
Certificates: []tls.Certificate{cer},
})
app.Listener(ln)
✅ Test
作用:测试 HTTP 路由和响应。可用于单元测试或调试。
func (app *App) Test(req *http.Request, msTimeout ...int) (*http.Response, error)
示例:
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("hello, World!")
})
req := httptest.NewRequest("GET", "http://localhost/", nil)
resp, _ := app.Test(req)
✅ Hooks
作用:返回 Fiber 应用的 Hook 配置(生命周期钩子)。
func (app *App) Hooks() *Hooks