Go语言Fiber框架详细教程
Fiber是一个受Express启发的Go语言Web框架,建立在Fasthttp(Go最快的HTTP引擎)之上。它旨在简化开发,同时保持高性能。本教程将详细介绍Fiber框架的使用。
目录
- 安装与设置
- 基本路由
- 中间件
- 请求处理
- 响应处理
- 路由组
- 静态文件服务
- 模板渲染
- WebSocket支持
- 测试
- 部署
- 最佳实践
1. 安装与设置
首先确保已安装Go(1.14或更高版本),然后初始化模块并安装Fiber:
go mod init myapp
go get github.com/gofiber/fiber/v2
创建一个基本应用:
package main
import "github.com/gofiber/fiber/v2"
func main() {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, Fiber!")
})
app.Listen(":3000")
}
运行应用:
go run main.go
2. 基本路由
Fiber支持所有HTTP方法:
// GET方法
app.Get("/get", func(c *fiber.Ctx) error {
return c.SendString("GET request")
})
// POST方法
app.Post("/post", func(c *fiber.Ctx) error {
return c.SendString("POST request")
})
// PUT方法
app.Put("/put", func(c *fiber.Ctx) error {
return c.SendString("PUT request")
})
// DELETE方法
app.Delete("/delete", func(c *fiber.Ctx) error {
return c.SendString("DELETE request")
})
// 匹配所有方法
app.All("/all", func(c *fiber.Ctx) error {
return c.SendString("Any HTTP method")
})
3. 中间件
中间件是Fiber的核心功能之一:
内置中间件
import "github.com/gofiber/fiber/v2/middleware/logger"
func main() {
app := fiber.New()
// 使用日志中间件
app.Use(logger.New())
// ...
}
自定义中间件
func AuthMiddleware(c *fiber.Ctx) error {
token := c.Get("Authorization")
if token != "secret" {
return c.Status(fiber.StatusUnauthorized).SendString("Unauthorized")
}
return c.Next()
}
app.Get("/protected", AuthMiddleware, func(c *fiber.Ctx) error {
return c.SendString("Protected content")
})
4. 请求处理
获取请求参数
// 查询参数
app.Get("/user", func(c *fiber.Ctx) error {
name := c.Query("name") // /user?name=John
return c.SendString("Hello, " + name)
})
// 路由参数
app.Get("/user/:id", func(c *fiber.Ctx) error {
id := c.Params("id") // /user/123
return c.SendString("User ID: " + id)
})
// 表单数据
app.Post("/form", func(c *fiber.Ctx) error {
name := c.FormValue("name")
return c.SendString("Hello, " + name)
})
// JSON数据
app.Post("/json", func(c *fiber.Ctx) error {
type User struct {
Name string `json:"name"`
}
user := new(User)
if err := c.BodyParser(user); err != nil {
return err
}
return c.JSON(user)
})
5. 响应处理
// 发送文本
app.Get("/text", func(c *fiber.Ctx) error {
return c.SendString("Plain text")
})
// 发送JSON
app.Get("/json", func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{
"name": "John",
"age": 30,
})
})
// 发送状态码
app.Get("/notfound", func(c *fiber.Ctx) error {
return c.Status(fiber.StatusNotFound).SendString("Not Found")
})
// 重定向
app.Get("/redirect", func(c *fiber.Ctx) error {
return c.Redirect("/new-location")
})
// 下载文件
app.Get("/download", func(c *fiber.Ctx) error {
return c.Download("./files/report.pdf")
})
6. 路由组
func main() {
app := fiber.New()
api := app.Group("/api", AuthMiddleware) // /api
v1 := api.Group("/v1") // /api/v1
v1.Get("/list", func(c *fiber.Ctx) error {
return c.SendString("API v1 list")
})
v2 := api.Group("/v2") // /api/v2
v2.Get("/list", func(c *fiber.Ctx) error {
return c.SendString("API v2 list")
})
app.Listen(":3000")
}
7. 静态文件服务
app.Static("/", "./public") // 服务./public目录下的文件
// 带前缀的静态文件服务
app.Static("/static", "./public")
// 自定义配置
app.Static("/", "./public", fiber.Static{
Compress: true,
ByteRange: true,
Browse: true,
Index: "index.html",
CacheDuration: 10 * time.Second,
})
8. 模板渲染
Fiber支持多种模板引擎:
import "github.com/gofiber/template/html"
func main() {
// 初始化HTML模板引擎
engine := html.New("./views", ".html")
app := fiber.New(fiber.Config{
Views: engine,
})
app.Get("/", func(c *fiber.Ctx) error {
// 渲染模板
return c.Render("index", fiber.Map{
"Title": "Hello, Fiber!",
})
})
app.Listen(":3000")
}
9. WebSocket支持
import "github.com/gofiber/websocket/v2"
app.Use("/ws", func(c *fiber.Ctx) error {
if websocket.IsWebSocketUpgrade(c) {
return c.Next()
}
return fiber.ErrUpgradeRequired
})
app.Get("/ws", websocket.New(func(c *websocket.Conn) {
for {
mt, msg, err := c.ReadMessage()
if err != nil {
break
}
fmt.Printf("recv: %s\n", msg)
err = c.WriteMessage(mt, msg)
if err != nil {
break
}
}
}))
10. 测试
Fiber提供了测试工具:
import (
"testing"
"github.com/gofiber/fiber/v2"
"github.com/stretchr/testify/assert"
)
func TestRoute(t *testing.T) {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, Test!")
})
req, _ := http.NewRequest("GET", "/", nil)
resp, err := app.Test(req)
assert.Nil(t, err)
assert.Equal(t, 200, resp.StatusCode)
body, _ := io.ReadAll(resp.Body)
assert.Equal(t, "Hello, Test!", string(body))
}
11. 部署
生产环境配置
app := fiber.New(fiber.Config{
Prefork: true, // 启用多进程
CaseSensitive: true,
StrictRouting: true,
ServerHeader: "Fiber",
AppName: "My App v1.0.0",
})
使用Docker
FROM golang:alpine AS builder
WORKDIR /app
COPY . .
RUN go mod download
RUN go build -o main .
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/main .
COPY --from=builder /app/.env .
EXPOSE 3000
CMD ["./main"]
12. 最佳实践
项目结构:
/myapp /controllers /models /routes /middlewares /config main.go
- 错误处理:
app.Use(func(c *fiber.Ctx) error {
defer func() {
if r := recover(); r != nil {
c.Status(500).JSON(fiber.Map{
"error": "Internal Server Error",
})
}
}()
return c.Next()
})
- 环境配置:
import "github.com/joho/godotenv"
func main() {
_ = godotenv.Load()
// ...
}
- 数据库集成:
import "gorm.io/gorm"
func ConnectDB() *gorm.DB {
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("Failed to connect to database")
}
return db
}
- 性能监控:
import "github.com/gofiber/fiber/v2/middleware/monitor"
app.Get("/metrics", monitor.New())
Fiber是一个高性能且易于使用的框架,适合构建各种规模的Web应用。通过本教程,你应该已经掌握了Fiber的核心功能,可以开始构建自己的应用了。