Skip to content

Latest commit

 

History

History
695 lines (540 loc) · 45.8 KB

README_zh-CN.md

File metadata and controls

695 lines (540 loc) · 45.8 KB

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.17 或更高版本的 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.40.0 已经在 Go 1.17 到 1.21 上测试过。
  • 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 的压缩中间件,默认支持 deflategzipbrotli
cors 使用各种选项启用跨源资源共享(CORS)
csrf 保护来自 CSRF 的漏洞
encryptcookie 加密 cookie 值的加密中间件
envvar 通过提供可选配置来公开环境变量
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 Recover 中间件将可以堆栈链中的任何位置将 panic 恢复,并将处理集中到 ErrorHandler
requestid 为每个请求添加一个 requestid.
session Session 中间件. 注意: 此中间件使用了我们的存储包.
skip Skip 中间件会在判断条为 true 时忽略此次请求
timeout 添加请求的最大时间,如果超时则发送给ErrorHandler 进行处理.
adaptor net/http 处理程序与 Fiber 请求处理程序之间的转换器,特别感谢 @arsmn!
helmet 通过设置各种 HTTP 头帮助保护您的应用程序
keyauth Key auth 中间件提供基于密钥的身份验证
redirect 用于重定向请求的中间件
rewrite Rewrite 中间件根据提供的规则重写URL路径。它有助于向后兼容或者创建更清晰、更具描述性的链接

🧬 外部中间件

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

中间件 描述
jwt JWT 返回一个 JSON Web Token(JWT) 身份验证中间件
storage 包含实现 Storage 接口的数据库驱动,它的设计旨在配合 fiber 的其他中间件来进行使用
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. Fiber 点个 ⭐ 星星。
  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

⭐️ Star 数增长情况

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