Fiber是一个受到Express启发的Web框架,建立在Go语言写的最快的FasthttpHTTP引擎的基础上。旨在简化 零内存分配和提高性能,以便快速开发。
## ⚡️ 快速入门
```go
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](https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=plaintext)和[Go Web](https://github.com/smallnest/go-web-framework-benchmark) 执行。如果要查看所有结果,请访问我们的[Wiki](https://docs.gofiber.io/benchmarks) 。
## ⚙️ 安装
首先, [下载](https://golang.org/dl/)并安装Go。 需要`1.11`或更高版本。
使用[`go get`](https://golang.org/cmd/go/#hdr-Add_dependencies_to_current_module_and_install_them)命令完成安装:
```bash
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
go get -u github.com/gofiber/fiber
```
## 🎯 特点
- 强大的[路由](https://docs.gofiber.io/routing)
- [静态文件](https://docs.gofiber.io/application#static)服务
- 极限[表现](https://docs.gofiber.io/benchmarks)
- [内存占用低](https://docs.gofiber.io/benchmarks)
- [API接口](https://docs.gofiber.io/context)
- [中间件](https://docs.gofiber.io/middleware)和[Next](https://docs.gofiber.io/context#next)支持
- [快速](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497)服务器端编程
- [模版引擎](https://github.com/gofiber/template)
- [WebSocket支持](https://docs.gofiber.io/middleware#websocket)
- [频率限制器](https://docs.gofiber.io/middleware#limiter)
- [15种语言](https://docs.gofiber.io/)
- 以及更多请[探索文档](https://docs.gofiber.io/)
## 💡 哲学
从[Node.js](https://nodejs.org/en/about/)切换到[Go](https://golang.org/doc/)的新`gopher`在开始构建`Web`应用程序或微服务之前正在应对学习曲线。 `Fiber`作为一个**Web框架** ,是按照**极简主义**的思想并遵循**UNIX方式**创建的,因此新的`gopher`可以在热烈和可信赖的欢迎中迅速进入`Go`的世界。
`Fiber`受到了互联网上最流行的`Web`框架`Express`的**启发** 。我们结合了`Express`的**易用性**和`Go`的**原始性能** 。如果您曾经在`Node.js`上实现过`Web`应用程序(*使用Express或类似工具*),那么许多方法和原理对您来说应该**非常易懂**。
我们**关注** _整个互联网_ 用户在[issues](https://github.com/gofiber/fiber/issues)和Discord [channel](https://gofiber.io/discord)的消息,为了创建一个**迅速**,**灵活**以及**友好**的`Go web`框架,满足**任何**任务,**最后期限**和开发者**技能**。就像`Express`在`JavaScript`世界中一样。
## 👀 示例
下面列出了一些常见示例。如果您想查看更多代码示例,请访问我们的[Recipes](https://github.com/gofiber/recipes)代码库或[API文档](https://docs.gofiber.io) 。
#### 📖 [**基础路由**](https://docs.gofiber.io/#basic-routing)
```go
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)
}
```
#### 📖 [**静态文件**](https://docs.gofiber.io/application#static)服务
```go
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)
}
```
#### 📖 [**中间件**](https://docs.gofiber.io/middleware)和[**Next**](https://docs.gofiber.io/context#next)
```go
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)
}
```
📚 展示更多代码示例
### 模版引擎
📖 [配置](https://docs.gofiber.io/application#settings)
📖 [模版引擎](https://github.com/gofiber/template)
📖 [渲染](https://docs.gofiber.io/context#render)
如果未设置模版引擎,则`Fiber`默认使用[html/template](https://golang.org/pkg/html/template/)。
如果您要执行部分模版或使用其他引擎,例如[amber](https://github.com/eknkc/amber),[handlebars](https://github.com/aymerick/raymond),[mustache](https://github.com/cbroglie/mustache)或者[pug](https://github.com/Joker/jade)等等...
请查看我们的[Template](https://github.com/gofiber/template)包,该包支持多个模版引擎。
```go
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,
})
})
// ...
}
```
### 组合路由链
📖 [路由分组](https://docs.gofiber.io/application#group)
```go
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](https://github.com/gofiber/fiber/blob/master/middleware/logger.md)
```go
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](https://docs.gofiber.io/middleware#cors)
```go
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:
```bash
curl -H "Origin: http://example.com" --verbose http://localhost:3000
```
### 自定义404响应
📖 [HTTP Methods](https://docs.gofiber.io/application#http-methods)
```go
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](https://docs.gofiber.io/context#json)
```go
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
📖 [Websocket](https://docs.gofiber.io/middleware#websocket)
```go
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](https://github.com/gofiber/fiber/blob/master/middleware/recover.md)
```go
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团队](https://github.com/orgs/gofiber/people)维护。
| 中间件 | 描述 | 内置中间件 |
| :--- | :--- | :--- |
| [adaptor](https://github.com/gofiber/adaptor) | `net/http`处理程序与`Fiber`处理程序之间的适配器,特别感谢 @arsmn! | - |
| [basicauth](https://github.com/gofiber/basicauth) | 基本身份验证中间件提供HTTP基本身份验证。验证有效时,它调用下一个处理程序,否则返回`401 Unauthorized`响应。 | - |
| [compress](https://github.com/gofiber/fiber/blob/master/middleware/compress.md) | `Fiber`的压缩中间件,默认情况下支持`deflate`,`gzip`和`brotli`。 | `middleware.Compress()` |
| [cors](https://github.com/gofiber/cors) | 使用各种选项启用跨域资源共享(CORS)。 | - |
| [csrf](https://github.com/gofiber/csrf) | 保护免受CSRF攻击。 | - |
| [filesystem](https://github.com/gofiber/fiber/blob/master/middleware/filesystem.md) | `Fiber`的FileSystem中间件,特别感谢 Alireza Salary | - |
| [favicon](https://github.com/gofiber/fiber/blob/master/middleware/favicon.md) | 如果提供了`favicon`文件路径,则忽略日志中的图标或从内存中提供图标。 | `middleware.Favicon()` |
| [helmet](https://github.com/gofiber/helmet) | 通过设置各种HTTP标头来保护您的应用程序。 | - |
| [jwt](https://github.com/gofiber/jwt) | JWT是返回JSON Web令牌(JWT)的身份验证中间件。 | - |
| [keyauth](https://github.com/gofiber/keyauth) | 密钥身份验证中间件提供基于密钥的身份验证。 | - |
| [limiter](https://github.com/gofiber/limiter) | `Fiber`的频率限制中间件。用于限制对公共API的重复请求,例如密码重置。 | - |
| [logger](https://github.com/gofiber/fiber/blob/master/middleware/logger.md) | HTTP 访问日志中间件。 | `middleware.Logger()` |
| [pprof](https://github.com/gofiber/pprof) | 特别感谢 Matthew Lee (@mthli) | - |
| [recover](https://github.com/gofiber/fiber/blob/master/middleware/recover.md) | 恢复中间件可从堆栈链中任何地方的`panic`中恢复,并将控制权交给集中式[错误处理器](error-handling.md). | `middleware.Recover()` |
| [rewrite](https://github.com/gofiber/rewrite) | `Rewrite`中间件根据提供的规则重写`URL`路径。它对于向后兼容或创建更简洁,更具描述性的链接很有帮助。 | - |
| [requestid](https://github.com/gofiber/fiber/blob/master/middleware/request_id.md) | Request ID中间件为请求生成唯一的ID。 | `middleware.RequestID()` |
| [session](https://github.com/gofiber/session) | `session`中间件通过了 @savsgio MIT 许可,建立在`fasthttp/session`之上。特别感谢 @thomasvvugt 帮助完成此中间件。 | - |
| [template](https://github.com/gofiber/template) | 该软件包包含8个模板引擎,需要配合Fiber`v1.10.x`以及Go`1.13`或更高版本使用。 | - |
| [websocket](https://github.com/gofiber/websocket) | `Fiber`基于`Fasthttp WebSocket`的中间件,支持`Locals`功能! | - |
## 🌱 第三方中间件
这是由`Fiber`社区创建的中间件列表,如果您想看到自己的中间件,请创建`PR`。
- [arsmn/fiber-casbin](https://github.com/arsmn/fiber-casbin)
- [arsmn/fiber-introspect](https://github.com/arsmn/fiber-introspect)
- [arsmn/fiber-swagger](https://github.com/arsmn/fiber-swagger)
- [arsmn/gqlgen](https://github.com/arsmn/gqlgen)
- [codemicro/fiber-cache](https://github.com/codemicro/fiber-cache)
- [itsursujit/fiber-boilerplate](https://github.com/itsursujit/fiber-boilerplate)
- [juandiii/go-jwk-security](https://github.com/juandiii/go-jwk-security)
- [kiyonlin/fiber_limiter](https://github.com/kiyonlin/fiber_limiter)
- [shareed2k/fiber_limiter](https://github.com/shareed2k/fiber_limiter)
- [shareed2k/fiber_tracing](https://github.com/shareed2k/fiber_tracing)
- [thomasvvugt/fiber-boilerplate](https://github.com/thomasvvugt/fiber-boilerplate)
## 💬 媒体
- [Welcome to Fiber — an Express.js styled web framework written in Go with ❤️](https://dev.to/koddr/welcome-to-fiber-an-express-js-styled-fastest-web-framework-written-with-on-golang-497) — _03 Feb 2020_
- [Fiber released v1.7! 🎉 What's new and is it still fast, flexible and friendly?](https://dev.to/koddr/fiber-v2-is-out-now-what-s-new-and-is-he-still-fast-flexible-and-friendly-3ipf) — _21 Feb 2020_
- [🚀 Fiber v1.8. What's new, updated and re-thinked?](https://dev.to/koddr/fiber-v1-8-what-s-new-updated-and-re-thinked-339h) — _03 Mar 2020_
- [Is switching from Express to Fiber worth it? 🤔](https://dev.to/koddr/are-sure-what-your-lovely-web-framework-running-so-fast-2jl1) — _01 Apr 2020_
- [Creating Fast APIs In Go Using Fiber](https://dev.to/jozsefsallai/creating-fast-apis-in-go-using-fiber-59m9) — _07 Apr 2020_
- [Building a Basic REST API in Go using Fiber](https://tutorialedge.net/golang/basic-rest-api-go-fiber/) - _23 Apr 2020_
- [📺 Building a REST API using GORM and Fiber](https://youtu.be/Iq2qT0fRhAA) - _25 Apr 2020_
- [🌎 Create a travel list app with Go, Fiber, Angular, MongoDB and Google Cloud Secret Manager](https://blog.yongweilun.me/create-a-travel-list-app-with-go-fiber-angular-mongodb-and-google-cloud-secret-manager-ck9fgxy0p061pcss1xt1ubu8t) - _25 Apr 2020_
- [Fiber v1.9.6 🔥 How to improve performance by 817% and stay fast, flexible and friendly?](https://dev.to/koddr/fiber-v1-9-5-how-to-improve-performance-by-817-and-stay-fast-flexible-and-friendly-2dp6) - _12 May 2020_
- [The road to web-based authentication with Fiber ⚡](https://vugt.me/the-road-to-web-based-authentication-with-fiber/) - _20 May 2020_
- [Building an Express-style API in Go with Fiber](https://blog.logrocket.com/express-style-api-go-fiber/) - _10 June 2020_
- [基于golang fiber和angular开发web](https://zhuanlan.zhihu.com/p/148925642) - _19 June 2020_
- [基于延迟计算令牌桶的gofiber频率限制中间件实现](https://zhuanlan.zhihu.com/p/149308936) - _20 June 2020_
- [Construir una API en Golang con Fiber 🇪🇸](https://enbonnet.me/article/53/construir-api-golang-con-fiber) - _28 June 2020_
- [📺Why Go Fiber Is THE New Framework To Learn](https://www.youtube.com/watch?v=kvwsPeWDLM8) - _29 June 2020_
- [解析Gofiber路由管理](https://zhuanlan.zhihu.com/p/152494502) - _08 July 2020_
- [📺 Introduction to Fiber - An Express-inspired web framework](https://youtu.be/MfFi4Gt-tos) - _25 July 2020_
## 👍 贡献
如果您要说声**谢谢**或支持`Fiber`的积极发展:
1. 为`Fiber`[GitHub Star](https://github.com/gofiber/fiber/stargazers)点个⭐星星。
2. 在[Twitter](https://twitter.com/intent/tweet?text=Fiber%20is%20an%20Express%20inspired%20%23web%20%23framework%20built%20on%20top%20of%20Fasthttp%2C%20the%20fastest%20HTTP%20engine%20for%20%23Go.%20Designed%20to%20ease%20things%20up%20for%20%23fast%20development%20with%20zero%20memory%20allocation%20and%20%23performance%20in%20mind%20%F0%9F%9A%80%20https%3A%2F%2Fgithub.com%2Fgofiber%2Ffiber)上发布有关项目的[推文](https://twitter.com/intent/tweet?text=Fiber%20is%20an%20Express%20inspired%20%23web%20%23framework%20built%20on%20top%20of%20Fasthttp%2C%20the%20fastest%20HTTP%20engine%20for%20%23Go.%20Designed%20to%20ease%20things%20up%20for%20%23fast%20development%20with%20zero%20memory%20allocation%20and%20%23performance%20in%20mind%20%F0%9F%9A%80%20https%3A%2F%2Fgithub.com%2Fgofiber%2Ffiber)。
3. 在[Medium](https://medium.com/),[Dev.to](https://dev.to/)或个人博客上写评论或教程。
4. 帮助我们通过[Crowdin](https://crowdin.com/project/gofiber) [](https://crowdin.com/project/gofiber)翻译我们的API文档
5. 通过捐赠[一杯咖啡](https://buymeacoff.ee/fenny)来支持本项目。
## ☕ 支持者
`Fibre`是一个开源项目,依靠捐赠来支付账单,例如我们的域名,`gitbook`,`netlify`和无服务器托管。如果要支持`Fiber`,可以 ☕ [**在这里买一杯咖啡**](https://buymeacoff.ee/fenny)
| | User | Donation |
| :---------------------------------------------------------- | :----------------------------------------------- | :-------- |
|  | [@destari](https://github.com/destari) | ☕ x 10 |
|  | [@dembygenesis](https://github.com/dembygenesis) | ☕ x 5 |
|  | [@thomasvvugt](https://github.com/thomasvvugt) | ☕ x 5 |
|  | [@hendratommy](https://github.com/hendratommy) | ☕ x 5 |
|  | [@ekaputra07](https://github.com/ekaputra07) | ☕ x 5 |
|  | [@jorgefuertes](https://github.com/jorgefuertes) | ☕ x 5 |
|  | [@candidosales](https://github.com/candidosales) | ☕ x 5 |
|  | [@l0nax](https://github.com/l0nax) | ☕ x 3 |
|  | [@ankush](https://github.com/ankush) | ☕ x 3 |
|  | [@bihe](https://github.com/bihe) | ☕ x 3 |
|  | [@justdave](https://github.com/justdave) | ☕ x 3 |
|  | [@koddr](https://github.com/koddr) | ☕ x 1 |
|  | [@lapolinar](https://github.com/lapolinar) | ☕ x 1 |
|  | [@diegowifi](https://github.com/diegowifi) | ☕ x 1 |
|  | [@ssimk0](https://github.com/ssimk0) | ☕ x 1 |
|  | [@raymayemir](https://github.com/raymayemir) | ☕ x 1 |
|  | [@melkorm](https://github.com/melkorm) | ☕ x 1 |
|  | [@marvinjwendt](https://github.com/thomasvvugt) | ☕ x 1 |
|  | [@toishy](https://github.com/toishy) | ☕ x 1 |
## 💻 Code Contributors
## ⭐️ Stargazers
## ⚠️ License
Copyright (c) 2019-present [Fenny](https://github.com/fenny) and [Contributors](https://github.com/gofiber/fiber/graphs/contributors). `Fiber` is free and open-source software licensed under the [MIT License](https://github.com/gofiber/fiber/blob/master/LICENSE). Official logo was created by [Vic Shóstak](https://github.com/koddr) and distributed under [Creative Commons](https://creativecommons.org/licenses/by-sa/4.0/) license (CC BY-SA 4.0 International).
**Third-party library licenses**
- [schema](https://github.com/gorilla/schema/blob/master/LICENSE)
- [fasthttp](https://github.com/valyala/fasthttp/blob/master/LICENSE)
- [fasttemplate](https://github.com/valyala/fasttemplate/blob/master/LICENSE)
- [bytebufferpool](https://github.com/valyala/bytebufferpool/blob/master/LICENSE)