35 KiB
Fiber是一个受到Express启发的Web框架,建立在Go语言写的最快的FasthttpHTTP引擎的基础上。旨在简化 零内存分配和提高性能,以便快速开发。
⚡️ 快速入门
package main
import "github.com/gofiber/fiber"
func main() {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) {
c.Send("Hello, World 👋!")
})
app.Listen(3000)
}
🤖 性能
这些测试由TechEmpower和Go Web 执行。如果要查看所有结果,请访问我们的Wiki 。
⚙️ 安装
首先, 下载并安装Go。 需要1.11
或更高版本。
使用go get
命令完成安装:
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
go get -u github.com/gofiber/fiber
🎯 特点
💡 哲学
从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) {
msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name"))
c.Send(msg) // => Hello john 👋!
})
// GET /john/75
app.Get("/:name/:age/:gender?", func(c *fiber.Ctx) {
msg := fmt.Sprintf("👴 %s is %s years old", c.Params("name"), c.Params("age"))
c.Send(msg) // => 👴 john is 75 years old
})
// GET /dictionary.txt
app.Get("/:file.:ext", func(c *fiber.Ctx) {
msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext"))
c.Send(msg) // => 📃 dictionary.txt
})
// GET /flights/LAX-SFO
app.Get("/flights/:from-:to", func(c *fiber.Ctx) {
msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to"))
c.Send(msg) // => 💸 From: LAX, To: SFO
})
// GET /api/register
app.Get("/api/*", func(c *fiber.Ctx) {
msg := fmt.Sprintf("✋ %s", c.Params("*"))
c.Send(msg) // => ✋ /api/register
})
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
app.Listen(3000)
}
📖 中间件和Next
func main() {
app := fiber.New()
// Match any route
app.Use(func(c *fiber.Ctx) {
fmt.Println("🥇 First handler")
c.Next()
})
// Match all routes starting with /api
app.Use("/api", func(c *fiber.Ctx) {
fmt.Println("🥈 Second handler")
c.Next()
})
// GET /api/register
app.Get("/api/list", func(c *fiber.Ctx) {
fmt.Println("🥉 Last handler")
c.Send("Hello, World 👋!")
})
app.Listen(3000)
}
📚 展示更多代码示例
模版引擎
如果未设置模版引擎,则Fiber
默认使用html/template。
如果您要执行部分模版或使用其他引擎,例如amber,handlebars,mustache或者pug等等...
请查看我们的Template包,该包支持多个模版引擎。
import (
"github.com/gofiber/fiber"
"github.com/gofiber/template/pug"
)
func main() {
// You can setup Views engine before initiation app:
app := fiber.New(&fiber.Settings{
Views: pug.New("./views", ".pug"),
})
// OR after initiation app at any convenient location:
app.Settings.Views = pug.New("./views", ".pug"),
// And now, you can call template `./views/home.pug` like this:
app.Get("/", func(c *fiber.Ctx) {
c.Render("home", fiber.Map{
"title": "Homepage",
"year": 1999,
})
})
// ...
}
组合路由链
📖 路由分组
func main() {
app := fiber.New()
// Root API route
api := app.Group("/api", cors()) // /api
// API v1 routes
v1 := api.Group("/v1", mysql()) // /api/v1
v1.Get("/list", handler) // /api/v1/list
v1.Get("/user", handler) // /api/v1/user
// API v2 routes
v2 := api.Group("/v2", mongodb()) // /api/v2
v2.Get("/list", handler) // /api/v2/list
v2.Get("/user", handler) // /api/v2/user
// ...
}
日志中间件
📖 Logger
import (
"github.com/gofiber/fiber"
"github.com/gofiber/fiber/middleware"
)
func main() {
app := fiber.New()
// Default
app.Use(middleware.Logger())
// Custom logging format
app.Use(middleware.Logger("${method} - ${path}"))
// Custom Config
app.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
Next: func(ctx *fiber.Ctx) bool {
return ctx.Path() != "/private"
},
Format: "${method} - ${path}",
Output: io.Writer,
}))
app.Listen(3000)
}
跨域资源共享(CORS)中间件
📖 CORS
import (
"github.com/gofiber/fiber"
"github.com/gofiber/cors"
)
func main() {
app := fiber.New()
// CORS with default config
app.Use(cors.New())
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) {
c.Send("This is a demo!")
})
app.Post("/register", func(c *fiber.Ctx) {
c.Send("Welcome!")
})
// Last middleware to match anything
app.Use(func(c *fiber.Ctx) {
c.SendStatus(404)
// => 404 "Not Found"
})
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) {
c.JSON(&User{"John", 20})
// => {"name":"John", "age":20}
})
app.Get("/json", func(c *fiber.Ctx) {
c.JSON(fiber.Map{
"success": true,
"message": "Hi John!",
})
// => {"success":true, "message":"Hi John!"}
})
app.Listen(3000)
}
升级到WebSocket
import (
"github.com/gofiber/fiber"
"github.com/gofiber/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
}
}
}))
app.Listen(3000)
// ws://localhost:3000/ws
}
恢复(panic)中间件
📖 Recover
import (
"github.com/gofiber/fiber"
"github.com/gofiber/fiber/middleware"
)
func main() {
app := fiber.New()
app.Use(middleware.Recover())
app.Get("/", func(c *fiber.Ctx) {
panic("normally this would crash your app")
})
app.Listen(3000)
}
🧬 Fiber中间件
此处列出的Fiber
中间件模块由Fiber团队维护。
中间件 | 描述 | 内置中间件 |
---|---|---|
adaptor | net/http 处理程序与Fiber 处理程序之间的适配器,特别感谢 @arsmn! |
- |
basicauth | 基本身份验证中间件提供HTTP基本身份验证。验证有效时,它调用下一个处理程序,否则返回401 Unauthorized 响应。 |
- |
compress | Fiber 的压缩中间件,默认情况下支持deflate ,gzip 和brotli 。 |
middleware.Compress() |
cors | 使用各种选项启用跨域资源共享(CORS)。 | - |
csrf | 保护免受CSRF攻击。 | - |
filesystem | Fiber 的FileSystem中间件,特别感谢 Alireza Salary |
- |
favicon | 如果提供了favicon 文件路径,则忽略日志中的图标或从内存中提供图标。 |
middleware.Favicon() |
helmet | 通过设置各种HTTP标头来保护您的应用程序。 | - |
jwt | JWT是返回JSON Web令牌(JWT)的身份验证中间件。 | - |
keyauth | 密钥身份验证中间件提供基于密钥的身份验证。 | - |
limiter | Fiber 的频率限制中间件。用于限制对公共API的重复请求,例如密码重置。 |
- |
logger | HTTP 访问日志中间件。 | middleware.Logger() |
pprof | 特别感谢 Matthew Lee (@mthli) | - |
recover | 恢复中间件可从堆栈链中任何地方的panic 中恢复,并将控制权交给集中式错误处理器. |
middleware.Recover() |
rewrite | Rewrite 中间件根据提供的规则重写URL 路径。它对于向后兼容或创建更简洁,更具描述性的链接很有帮助。 |
- |
requestid | Request ID中间件为请求生成唯一的ID。 | middleware.RequestID() |
session | session 中间件通过了 @savsgio MIT 许可,建立在fasthttp/session 之上。特别感谢 @thomasvvugt 帮助完成此中间件。 |
- |
template | 该软件包包含8个模板引擎,需要配合Fiberv1.10.x 以及Go1.13 或更高版本使用。 |
- |
websocket | Fiber 基于Fasthttp WebSocket 的中间件,支持Locals 功能! |
- |
🌱 第三方中间件
这是由Fiber
社区创建的中间件列表,如果您想看到自己的中间件,请创建PR
。
- arsmn/fiber-swagger
- arsmn/fiber-casbin
- arsmn/fiber-introspect
- shareed2k/fiber_tracing
- shareed2k/fiber_limiter
- thomasvvugt/fiber-boilerplate
- arsmn/gqlgen
- kiyonlin/fiber_limiter
- juandiii/go-jwk-security
💬 媒体
- Welcome to Fiber — an Express.js styled web framework written in Go with ❤️ — 03 Feb 2020
- Fiber released v1.7! 🎉 What's new and is it still fast, flexible and friendly? — 21 Feb 2020
- 🚀 Fiber v1.8. What's new, updated and re-thinked? — 03 Mar 2020
- Is switching from Express to Fiber worth it? 🤔 — 01 Apr 2020
- Creating Fast APIs In Go Using Fiber — 07 Apr 2020
- Building a Basic REST API in Go using Fiber - 23 Apr 2020
- 📺 Building a REST API using GORM and Fiber - 25 Apr 2020
- 🌎 Create a travel list app with Go, Fiber, Angular, MongoDB and Google Cloud Secret Manager - 25 Apr 2020
- Fiber v1.9.6 🔥 How to improve performance by 817% and stay fast, flexible and friendly? - 12 May 2020
- The road to web-based authentication with Fiber ⚡ - 20 May 2020
- Building an Express-style API in Go with Fiber - 10 June 2020
- 基于golang fiber和angular开发web - 19 June 2020
- 基于延迟计算令牌桶的gofiber频率限制中间件实现 - 20 June 2020
- Construir una API en Golang con Fiber 🇪🇸 - 28 June 2020
- 📺Why Go Fiber Is THE New Framework To Learn - 29 June 2020
- 解析Gofiber路由管理 - 08 July 2020
👍 贡献
如果您要说声谢谢或支持Fiber
的积极发展:
- 为
Fiber
GitHub Star点个⭐星星。 - 在Twitter上发布有关项目的推文。
- 在Medium,Dev.to或个人博客上写评论或教程。
- 帮助我们通过Crowdin
翻译我们的API文档
- 通过捐赠一杯咖啡来支持本项目。
☕ 支持者
Fibre
是一个开源项目,依靠捐赠来支付账单,例如我们的域名,gitbook
,netlify
和无服务器托管。如果要支持Fiber
,可以 ☕ 在这里买一杯咖啡
User | Donation | |
---|---|---|
@destari | ☕ x 10 | |
@thomasvvugt | ☕ x 5 | |
@hendratommy | ☕ x 5 | |
@ekaputra07 | ☕ x 5 | |
@jorgefuertes | ☕ x 5 | |
@candidosales | ☕ x 5 | |
@l0nax | ☕ x 3 | |
@ankush | ☕ x 3 | |
@bihe | ☕ x 3 | |
@justdave | ☕ x 3 | |
@koddr | ☕ x 1 | |
@lapolinar | ☕ x 1 | |
@diegowifi | ☕ x 1 | |
@ssimk0 | ☕ x 1 | |
@raymayemir | ☕ x 1 | |
@melkorm | ☕ x 1 | |
@marvinjwendt | ☕ x 1 | |
@toishy | ☕ x 1 |
💻 Code Contributors
⭐️ Stargazers
⚠️ License
Copyright (c) 2019-present Fenny and Contributors. Fiber
is free and open-source software licensed under the MIT License. Official logo was created by Vic Shóstak and distributed under Creative Commons license (CC BY-SA 4.0 International).
Third-party library licenses