一架梯子,一头程序猿,仰望星空!
Go Fiber教程 > 内容正文

Go Fiber快速入门


Fiber是一个受到Express(js 流行web框架)启发的Web框架,基于Go语言编写的最快的 HTTP 引擎 Fasthttp构建。旨在通过零内存分配高性能服务,使快速开发更加简便。

特点

  • 强大的路由
  • 静态文件服务
  • 极致性能
  • 低内存占用
  • API 接口
  • 支持中间件和 Next
  • 快速上手
  • 模版引擎
  • 支持 WebSocket
  • Server-Sent events
  • 频率限制

哲学

从 Node.js切换到Go的新 gopher 在开始构建 Web 应用程序或微服务之前需要经历一段艰难的学习过程。 而 Fiber,一个基于极简主义并且遵循 UNIX 方式创建的 Web 框架, 使新的 gopher 可以在热烈和可信赖的欢迎中迅速进入 Go 的世界。

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

快速入门

安装

确保已安装 1.17 或更高版本的 Go。

通过创建文件夹并在文件夹内运行 go mod init github.com/your/repo 来初始化项目,然后使用 go get命令安装 Fiber:

go get -u github.com/gofiber/fiber/v2

Hello World

package main

// 导入fiber包
import "github.com/gofiber/fiber/v2"

func main() {
    // 定义fiber应用
    app := fiber.New()

    // 定义http route
    app.Get("/", func(c *fiber.Ctx) error {
        // 以字符串的形式返回hello world
        return c.SendString("Hello, World 👋!")
    })

    // 监听3000端口
    app.Listen(":3000")
}

通过: http://localhost:3000/ 访问

基础路由

fiber基础路由例子

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()

    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"))
}

中间件

通过中间件增强http请求处理能力

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

    // 匹配任意路由,这里通过闭包函数自定义中间件
    app.Use(func(c *fiber.Ctx) error {
        fmt.Println("🥇 First handler")
        // 继续处理下一个中间件或者路由函数
        return c.Next()
    })

    // 匹配 /api 开头的路由
    app.Use("/api", func(c *fiber.Ctx) error {
        fmt.Println("🥈 Second handler")
        return c.Next()
    })

    // 使用框架内置的中间件-异常处理中间件
    app.Use(recover.New())


    // 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

package main

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/template/pug"
)

func main() {
    // 设置模板引擎
    app := fiber.New(fiber.Config{
        Views: pug.New("./views", ".pug"),
    })

    app.Get("/", func(c *fiber.Ctx) error {
        // 通过fiber.map模板参数,渲染./views/home.pug模板
        return c.Render("home", fiber.Map{
            "title": "Homepage",
            "year":  1999,
        })
    })

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

跨域资源共享(CORS)中间件

用于 Fiber 的 CORS 中间件,可通过各种选项启用跨源资源共享,防止CORS攻击。

import (
    "log"

    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/cors"
)

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

    // 默认CORS配置
    app.Use(cors.New())

    // 或者自定义CORS参数,允许那些域名请求API
    app.Use(cors.New(cors.Config{
        AllowOrigins: "https://www.tizi365.com, https://tizi365.com",
        AllowHeaders:  "Origin, Content-Type, Accept",
    }))

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

通过在请求头中设置 Origin 传递任何域来检查 CORS :

curl -H "Origin: https://www.tizi365.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!")
    })

    // 最后一个引用的中间件会匹配所有的请求,包括404
    app.Use(func(c *fiber.Ctx) error {
        // 其他处理逻辑
        // 返回404状态
        return c.SendStatus(404)
        // => 404 "Not Found"
    })

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

JSON 响应

fiber返回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"))
}

恢复(panic)中间件

拦截panic错误,避免程序崩溃退出

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/recover"
)

func main() {
    app := fiber.New()
    // 使用painc中间件,拦截panic异常
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("normally this would crash your app")
    })

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

基准测试


[

限制

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