Fiber,一个受Express启发的Golang Web框架,建立在Fasthttp 的基础之上。旨在简化、零内存分配和高性能,以及快速开发。
⚡️ 快速入门
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")
}
🤖 性能
这些测试由TechEmpower和Go Web 执行。如果要查看所有结果,请访问我们的Wiki 。
⚙️ 安装
确保已安装 (下载) 1.14
或更高版本的 Go。
通过创建文件夹并在文件夹内运行 go mod init github.com/your/repo
(了解更多) 来初始化项目,然后使用 go get
命令安装 Fiber:
go get -u github.com/gofiber/fiber/v2
🎯 特点
💡 哲学
从Node.js切换到Go的新gopher
在开始构建Web
应用程序或微服务之前正在应对学习曲线。 Fiber
作为一个Web 框架 ,是按照极简主义的思想并遵循UNIX 方式创建的,因此新的gopher
可以在热烈和可信赖的欢迎中迅速进入Go
的世界。
Fiber
受到了互联网上最流行的Web
框架Express
的启发 。我们结合了Express
的易用性和Go
的原始性能 。如果您曾经在Node.js
上实现过Web
应用程序(使用 Express 或类似工具),那么许多方法和原理对您来说应该非常易懂。
我们关注 整个互联网 用户在issues和 Discord channel的消息,为了创建一个迅速,灵活以及友好的Go web
框架,满足任何任务,最后期限和开发者技能。就像Express
在JavaScript
世界中一样。
👀 示例
下面列出了一些常见示例。如果您想查看更多代码示例,请访问我们的Recipes代码库或API 文档 。
📖 基础路由
func main() {
app := fiber.New()
// GET /john
app.Get("/:name", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name"))
return c.SendString(msg) // => Hello john 👋!
})
// GET /john/75
app.Get("/:name/:age", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("👴 %s is %s years old", c.Params("name"), c.Params("age"))
return c.SendString(msg) // => 👴 john is 75 years old
})
// GET /dictionary.txt
app.Get("/:file.:ext", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext"))
return c.SendString(msg) // => 📃 dictionary.txt
})
// GET /flights/LAX-SFO
app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to"))
return c.SendString(msg) // => 💸 From: LAX, To: SFO
})
// GET /api/register
app.Get("/api/*", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("✋ %s", c.Params("*"))
return c.SendString(msg) // => ✋ register
})
log.Fatal(app.Listen(":3000"))
}
📖 静态文件服务
func main() {
app := fiber.New()
app.Static("/", "./public")
// => http://localhost:3000/js/script.js
// => http://localhost:3000/css/style.css
app.Static("/prefix", "./public")
// => http://localhost:3000/prefix/js/script.js
// => http://localhost:3000/prefix/css/style.css
app.Static("*", "./public/index.html")
// => http://localhost:3000/any/path/shows/index/html
log.Fatal(app.Listen(":3000"))
}
📖 中间件和Next
func main() {
app := fiber.New()
// Match any route
app.Use(func(c *fiber.Ctx) error {
fmt.Println("🥇 First handler")
return c.Next()
})
// Match all routes starting with /api
app.Use("/api", func(c *fiber.Ctx) error {
fmt.Println("🥈 Second handler")
return c.Next()
})
// GET /api/register
app.Get("/api/list", func(c *fiber.Ctx) error {
fmt.Println("🥉 Last handler")
return c.SendString("Hello, World 👋!")
})
log.Fatal(app.Listen(":3000"))
}
📚 展示更多代码示例
模版引擎
如果未设置模版引擎,则Fiber
默认使用html/template。
如果您要执行部分模版或使用其他引擎,例如amber,handlebars,mustache或者pug等等…
请查看我们的Template包,该包支持多个模版引擎。
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/template/pug"
)
func main() {
// You can setup Views engine before initiation app:
app := fiber.New(fiber.Config{
Views: pug.New("./views", ".pug"),
})
// And now, you can call template `./views/home.pug` like this:
app.Get("/", func(c *fiber.Ctx) error {
return c.Render("home", fiber.Map{
"title": "Homepage",
"year": 1999,
})
})
log.Fatal(app.Listen(":3000"))
}
组合路由链
📖 路由分组
func middleware(c *fiber.Ctx) error {
fmt.Println("Don't mind me!")
return c.Next()
}
func handler(c *fiber.Ctx) error {
return c.SendString(c.Path())
}
func main() {
app := fiber.New()
// Root API route
api := app.Group("/api", middleware) // /api
// API v1 routes
v1 := api.Group("/v1", middleware) // /api/v1
v1.Get("/list", handler) // /api/v1/list
v1.Get("/user", handler) // /api/v1/user
// API v2 routes
v2 := api.Group("/v2", middleware) // /api/v2
v2.Get("/list", handler) // /api/v2/list
v2.Get("/user", handler) // /api/v2/user
// ...
}
日志中间件
📖 Logger
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/logger"
)
func main() {
app := fiber.New()
app.Use(logger.New())
// ...
log.Fatal(app.Listen(":3000"))
}
跨域资源共享(CORS)中间件
📖 CORS
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
)
func main() {
app := fiber.New()
app.Use(cors.New())
// ...
log.Fatal(app.Listen(":3000"))
}
通过在请求头中设置Origin
传递任何域来检查 CORS:
curl -H "Origin: http://example.com" --verbose http://localhost:3000
自定义 404 响应
func main() {
app := fiber.New()
app.Static("/", "./public")
app.Get("/demo", func(c *fiber.Ctx) error {
return c.SendString("This is a demo!")
})
app.Post("/register", func(c *fiber.Ctx) error {
return c.SendString("Welcome!")
})
// Last middleware to match anything
app.Use(func(c *fiber.Ctx) error {
return c.SendStatus(404)
// => 404 "Not Found"
})
log.Fatal(app.Listen(":3000"))
}
JSON 响应
📖 JSON
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
app := fiber.New()
app.Get("/user", func(c *fiber.Ctx) error {
return c.JSON(&User{"John", 20})
// => {"name":"John", "age":20}
})
app.Get("/json", func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{
"success": true,
"message": "Hi John!",
})
// => {"success":true, "message":"Hi John!"}
})
log.Fatal(app.Listen(":3000"))
}
升级到 WebSocket
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/websocket"
)
func main() {
app := fiber.New()
app.Get("/ws", websocket.New(func(c *websocket.Conn) {
for {
mt, msg, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
log.Printf("recv: %s", msg)
err = c.WriteMessage(mt, msg)
if err != nil {
log.Println("write:", err)
break
}
}
}))
log.Fatal(app.Listen(":3000"))
// ws://localhost:3000/ws
}
恢复(panic)中间件
📖 Recover
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("normally this would crash your app")
})
log.Fatal(app.Listen(":3000"))
}
🧬 内置中间件
以下为fiber
框架的内置中间件:
中间件 | 描述 |
---|---|
basicauth | basicauth中间件提供HTTP基本身份验证 |
compress | Fiber的压缩中间件,它支持deflate,gzip 和 brotli(默认) |
cache | 拦截和响应缓存 |
cors | 跨域处理 |
csrf | CSRF攻击防护 |
filesystem | Fiber的文件系统中间件 |
favicon | favicon图标 |
limiter | 请求频率限制 中间件,用于控制API请求频率 |
logger | HTTP请求与响应日志记录器 |
pprof | pprof 中间件 |
proxy | 请求代理 |
requestid | 为每个请求添加一个requestid。 |
recover | Recover 中间件将程序从panic 状态中恢复过来 |
timeout | 添加请求的最大时间,如果超时,则转发给ErrorHandler。 |
🧬 外部中间件
有fiber
团队维护的外部中间件
中间件 | 描述 |
---|---|
adaptor | net/http 与 Fiber 请求的相互转换适配器 |
helmet | 可设置各种HTTP Header来保护您的应用 |
jwt | JSON Web Token (JWT) 中间件 |
keyauth | 提供基于密钥的身份验证 |
rewrite | URL路径重写 |
session | Session中间件 |
template | 模板引擎 |
websocket | Fasthttp WebSocket 中间件 |
🌱 第三方中间件
这是由Fiber
社区创建的中间件列表,如果您想看到自己的中间件,请创建PR
。
- arsmn/fiber-casbin
- arsmn/fiber-introspect
- arsmn/fiber-swagger
- arsmn/gqlgen
- codemicro/fiber-cache
- sujit-baniya/fiber-boilerplate
- juandiii/go-jwk-security
- kiyonlin/fiber_limiter
- shareed2k/fiber_limiter
- shareed2k/fiber_tracing
- thomasvvugt/fiber-boilerplate
- ansrivas/fiberprometheus
- LdDl/fiber-long-poll
- K0enM/fiber_vhost
- theArtechnology/fiber-inertia