Go语言Fiber框架详细教程

Fiber是一个受Express启发的Go语言Web框架,建立在Fasthttp(Go最快的HTTP引擎)之上。它旨在简化开发,同时保持高性能。本教程将详细介绍Fiber框架的使用。

目录

  1. 安装与设置
  2. 基本路由
  3. 中间件
  4. 请求处理
  5. 响应处理
  6. 路由组
  7. 静态文件服务
  8. 模板渲染
  9. WebSocket支持
  10. 测试
  11. 部署
  12. 最佳实践

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. 最佳实践

  1. 项目结构

    /myapp
      /controllers
      /models
      /routes
      /middlewares
      /config
      main.go
    
  2. 错误处理
   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()
   })
  1. 环境配置
   import "github.com/joho/godotenv"

   func main() {
       _ = godotenv.Load()
       // ...
   }
  1. 数据库集成
   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
   }
  1. 性能监控
   import "github.com/gofiber/fiber/v2/middleware/monitor"

   app.Get("/metrics", monitor.New())

Fiber是一个高性能且易于使用的框架,适合构建各种规模的Web应用。通过本教程,你应该已经掌握了Fiber的核心功能,可以开始构建自己的应用了。









results matching ""

    No results matching ""