Skip to content
Permalink
master
Switch branches/tags
Go to file
63 contributors

Users who have contributed to this file

@Fenny @koddr @ReneWerner87 @efectn @kiyonlin @hi019 @thomasvvugt @alfuhigi @vecpeng @codemicro @kastkeepitjumpinlikekangaroos @K0enM

Fiber

Fiber是一个受到Express启发的Web框架,基于使用Go语言编写的最快的HTTP引擎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")
}

🤖 基准测试

这些测试由TechEmpowerGo 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,一个遵循极简主义UNIX 方式创建的Web 框架,使新的gopher可以在热烈和可信赖的欢迎中迅速进入Go的世界。

Fiber受到了互联网上最流行的Web框架Express启发 。我们结合了Express易用性Go原始性能 。如果您曾经使用Node.js构建Web应用程序(使用 Express 或类似框架),那么许多方法和原理对您来说应该非常易懂

我们会倾听用户在issues和 Discord channel和在互联网上的所有诉求,为了创建一个能让有着任何技术栈的开发者都能在deadline前完成任务的迅速灵活以及友好Go web框架,就像ExpressJavaScript世界中一样。

⚠️ 限制

  • 由于 Fiber 使用了 unsafe 特性,导致其可能与最新的 Go 版本不兼容。Fiber 2.29.0 已经在 Go 1.14 到 1.18 上测试过。
  • Fiber 与 net/http 接口不兼容。也就是说你无法使用 gqlen,go-swagger 或者任何其他属于 net/http 生态的项目。

👀 示例

下面列出了一些常见示例。如果您想查看更多代码示例,请访问我们的Recipes代码库或API 文档

📖 基础路由

func main() {
    app := fiber.New()

    // GET /api/register
    app.Get("/api/*", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("✋ %s", c.Params("*"))
        return c.SendString(msg) // => ✋ register
    })

    // 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 /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 /john/75
    app.Get("/:name/:age/:gender?", 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 /john
    app.Get("/:name", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name"))
        return c.SendString(msg) // => Hello john 👋!
    })

    log.Fatal(app.Listen(":3000"))
}

📖 路由命名

func main() {
    app := fiber.New()

    // GET /api/register
    app.Get("/api/*", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("✋ %s", c.Params("*"))
        return c.SendString(msg) // => ✋ register
    }).Name("api")

    data, _ := json.MarshalIndent(app.GetRoute("api"), "", "  ")
    fmt.Print(string(data))
    // Prints:
    // {
    //    "method": "GET",
    //    "name": "api",
    //    "path": "/api/*",
    //    "params": [
    //      "*1"
    //    ]
    // }


    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

如果您要执行部分模版或使用其他引擎,例如amberhandlebarsmustache或者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 响应

📖 HTTP Methods

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

📖 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
}

Server-Sent Events

📖 More Info

import (
    "github.com/gofiber/fiber/v2"
    "github.com/valyala/fasthttp"
)

func main() {
  app := fiber.New()

  app.Get("/sse", func(c *fiber.Ctx) error {
    c.Set("Content-Type", "text/event-stream")
    c.Set("Cache-Control", "no-cache")
    c.Set("Connection", "keep-alive")
    c.Set("Transfer-Encoding", "chunked")

    c.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
      fmt.Println("WRITER")
      var i int
      
      for {
        i++
        msg := fmt.Sprintf("%d - the time is %v", i, time.Now())
        fmt.Fprintf(w, "data: Message: %s\n\n", msg)
        fmt.Println(msg)

        w.Flush()
        time.Sleep(5 * time.Second)
      }
    }))

    return nil
  })

  log.Fatal(app.Listen(":3000"))
}

恢复(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 基本身份验证中间件提供HTTP基本身份验证。 它为有效凭证调用下一个处理程序,为丢失或无效凭证调用401 Unauthorized.
cache 拦截和缓存响应.
compress Fiber的压缩中间件,默认支持' deflate ', ' gzip '和' brotli '.
cors 使用各种选项启用跨源资源共享(CORS).
csrf 保护来自CSRF的漏洞.
encryptcookie 加密 cookie 值的加密中间件.
etag 让缓存更加高效并且节省带宽,让web服务不再需要重新响应整个响应体如果响应内容未变更.
expvar 通过其HTTP服务器运行时间提供JSON格式的暴露变体.
favicon 如果提供了文件路径,则忽略日志中的图标或从内存中服务.
filesystem Fiber文件系统中间件,特别感谢 Alireza Salary.
limiter 用于Fiber的限速中间件。 用于限制对公共api和/或端点的重复请求,如密码重置.
logger HTTP请求/响应日志.
monitor 报告服务器指标,受Express-status-monitor启发.
pprof 特别感谢 Matthew Lee (@mthli)
proxy 允许您将请求proxy到多个服务器
recover 恢复中间件从堆栈链中的任何位置的恐慌中恢复,并将控制处理到集中式. ErrorHandler.
requestid 为每个请求添加一个requesttid.
session Session 中间件. 注意: 此中间件使用了我们的存储包.
skip Skip middleware that skips a wrapped handler is a predicate is true.
timeout 添加请求的最大时间,如果超过了,则发送给ErrorHandler.

🧬 外部中间件

以下为外部托管的中间件列表,由Fiber团队维护。

中间件 描述
adaptor net/http处理程序与Fiber请求处理程序之间的转换器,特别感谢 @arsmn!
helmet 通过设置各种HTTP头帮助保护您的应用程序。
jwt JWT返回一个JSON Web Token(JWT)身份验证中间件。
keyauth Key auth中间件提供基于密钥的身份验证。
redirect Redirect middleware
rewrite Rewrite中间件根据提供的规则重写URL路径。它有助于向后兼容或者创建更清晰、更具描述性的链接。
storage Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares.
template 该软件包包含8个模板引擎,可与Fiber v1.10.x Go 1.13或更高版本一起使用。
websocket 基于 Fasthttp WebSocket for Fiber与Locals支持!

🕶️ Awesome List

For more articles, middlewares, examples or tools check our awesome list.

👍 贡献

如果想感谢我们或支持Fiber的积极发展:

  1. FiberGitHub Star点个 星星。
  2. Twitter上发布有关项目的推文
  3. MediumDev.to或个人博客上写评论或教程。
  4. 通过捐赠一杯咖啡来支持本项目。

支持者

Fiber是一个开源项目,依靠捐赠来支付账单,例如我们的域名,gitbooknetlify和无服务器托管。如果要支持Fiber,可以 在这里买一杯咖啡

User Donation
@destari x 10
@dembygenesis x 5
@thomasvvugt x 5
@hendratommy x 5
@ekaputra07 x 5
@jorgefuertes x 5
@candidosales x 5
@l0nax 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 over time

⚠️ 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