路由参数 #

一、参数类型概述 #

1.1 参数分类 #

Fiber支持多种参数类型:

类型 来源 获取方法
路径参数 URL路径 c.Params()
查询参数 URL查询字符串 c.Query()
表单参数 请求体(表单) c.FormValue()
JSON参数 请求体(JSON) c.BodyParser()
请求头 HTTP头部 c.Get()
Cookie HTTP Cookie c.Cookies()

1.2 参数位置示意 #

text
GET /users/123/posts?page=1&limit=10
         │           │
         │           └── 查询参数
         └── 路径参数

POST /users
Content-Type: application/json

{"name": "John", "age": 25}
└── JSON参数(请求体)

二、路径参数 #

2.1 基本用法 #

go
// 必需参数
app.Get("/users/:id", func(c *fiber.Ctx) error {
    id := c.Params("id")
    return c.SendString("User ID: " + id)
})

// 访问 /users/123 → User ID: 123

2.2 可选参数 #

go
// 可选参数(带?)
app.Get("/users/:id?", func(c *fiber.Ctx) error {
    id := c.Params("id", "default")
    return c.SendString("User ID: " + id)
})

// 访问 /users/123 → User ID: 123
// 访问 /users     → User ID: default

2.3 多个参数 #

go
app.Get("/users/:userId/posts/:postId", func(c *fiber.Ctx) error {
    userId := c.Params("userId")
    postId := c.Params("postId")
    return c.JSON(fiber.Map{
        "userId": userId,
        "postId": postId,
    })
})

// 访问 /users/1/posts/100
// 返回 {"userId": "1", "postId": "100"}

2.4 整数参数 #

go
app.Get("/page/:num", func(c *fiber.Ctx) error {
    // 获取整数参数,带默认值
    num := c.ParamsInt("num", 1)
    return c.SendString("Page: " + strconv.Itoa(num))
})

// 访问 /page/5  → Page: 5
// 访问 /page/   → Page: 1(默认值)

2.5 通配符参数 #

go
// 匿名通配符
app.Get("/files/*", func(c *fiber.Ctx) error {
    path := c.Params("*")
    return c.SendString("File: " + path)
})

// 命名通配符
app.Get("/download/*filepath", func(c *fiber.Ctx) error {
    filepath := c.Params("filepath")
    return c.SendString("Download: " + filepath)
})

// 访问 /files/docs/readme.md
// 返回 File: docs/readme.md

2.6 正则参数 #

go
// 只匹配数字
app.Get("/users/:id<\\d+>", func(c *fiber.Ctx) error {
    id := c.Params("id")
    return c.SendString("User ID: " + id)
})

// 只匹配字母
app.Get("/category/:name<[a-z]+>", func(c *fiber.Ctx) error {
    name := c.Params("name")
    return c.SendString("Category: " + name)
})

// 自定义正则
app.Get("/code/:code<[A-Z]{3}[0-9]{3}>", func(c *fiber.Ctx) error {
    code := c.Params("code")
    return c.SendString("Code: " + code)
})

三、查询参数 #

3.1 基本用法 #

go
app.Get("/search", func(c *fiber.Ctx) error {
    q := c.Query("q")
    return c.SendString("Search: " + q)
})

// 访问 /search?q=golang
// 返回 Search: golang

3.2 带默认值 #

go
app.Get("/list", func(c *fiber.Ctx) error {
    page := c.Query("page", "1")
    limit := c.Query("limit", "10")
    return c.JSON(fiber.Map{
        "page":  page,
        "limit": limit,
    })
})

// 访问 /list
// 返回 {"page": "1", "limit": "10"}

// 访问 /list?page=2&limit=20
// 返回 {"page": "2", "limit": "20"}

3.3 获取所有查询参数 #

go
app.Get("/params", func(c *fiber.Ctx) error {
    // 获取所有查询参数
    params := c.Queries()
    return c.JSON(params)
})

// 访问 /params?a=1&b=2&c=3
// 返回 {"a": "1", "b": "2", "c": "3"}

3.4 解析到结构体 #

go
type SearchQuery struct {
    Q     string `query:"q"`
    Page  int    `query:"page"`
    Limit int    `query:"limit"`
}

app.Get("/search", func(c *fiber.Ctx) error {
    var query SearchQuery
    if err := c.QueryParser(&query); err != nil {
        return err
    }
    return c.JSON(query)
})

// 访问 /search?q=golang&page=1&limit=10
// 返回 {"Q": "golang", "Page": 1, "Limit": 10}

四、表单参数 #

4.1 基本用法 #

go
app.Post("/login", func(c *fiber.Ctx) error {
    username := c.FormValue("username")
    password := c.FormValue("password")
    
    return c.JSON(fiber.Map{
        "username": username,
        "password": password,
    })
})

4.2 带默认值 #

go
app.Post("/settings", func(c *fiber.Ctx) error {
    theme := c.FormValue("theme", "light")
    lang := c.FormValue("lang", "en")
    
    return c.JSON(fiber.Map{
        "theme": theme,
        "lang":  lang,
    })
})

4.3 获取所有表单参数 #

go
app.Post("/form", func(c *fiber.Ctx) error {
    // 获取所有表单值
    values := c.Request().PostArgs()
    
    result := make(map[string]string)
    values.VisitAll(func(key, value []byte) {
        result[string(key)] = string(value)
    })
    
    return c.JSON(result)
})

4.4 解析到结构体 #

go
type LoginForm struct {
    Username string `form:"username"`
    Password string `form:"password"`
    Remember bool   `form:"remember"`
}

app.Post("/login", func(c *fiber.Ctx) error {
    var form LoginForm
    if err := c.BodyParser(&form); err != nil {
        return err
    }
    return c.JSON(form)
})

五、JSON参数 #

5.1 解析JSON #

go
type User struct {
    Name  string `json:"name"`
    Email string `json:"email"`
    Age   int    `json:"age"`
}

app.Post("/users", func(c *fiber.Ctx) error {
    var user User
    if err := c.BodyParser(&user); err != nil {
        return c.Status(400).JSON(fiber.Map{
            "error": "Invalid JSON",
        })
    }
    return c.JSON(user)
})

5.2 解析到Map #

go
app.Post("/data", func(c *fiber.Ctx) error {
    var data map[string]interface{}
    if err := c.BodyParser(&data); err != nil {
        return err
    }
    return c.JSON(data)
})

5.3 获取原始Body #

go
app.Post("/raw", func(c *fiber.Ctx) error {
    body := c.Body()
    return c.Send(body)
})

app.Post("/raw-string", func(c *fiber.Ctx) error {
    body := c.BodyString()
    return c.SendString(body)
})

六、请求头参数 #

6.1 获取请求头 #

go
app.Get("/headers", func(c *fiber.Ctx) error {
    // 获取单个请求头
    contentType := c.Get("Content-Type")
    auth := c.Get("Authorization")
    
    // 获取所有请求头
    headers := c.GetReqHeaders()
    
    return c.JSON(fiber.Map{
        "content-type": contentType,
        "authorization": auth,
        "all": headers,
    })
})

6.2 常用请求头快捷方法 #

go
app.Get("/info", func(c *fiber.Ctx) error {
    return c.JSON(fiber.Map{
        "host":        c.Hostname(),
        "protocol":    c.Protocol(),
        "ip":          c.IP(),
        "ips":         c.IPs(),
        "userAgent":   c.Get("User-Agent"),
        "contentType": c.Get("Content-Type"),
        "accept":      c.Get("Accept"),
    })
})

七、Cookie参数 #

7.1 获取Cookie #

go
app.Get("/cookie", func(c *fiber.Ctx) error {
    // 获取单个Cookie
    session := c.Cookies("session")
    token := c.Cookies("token", "default")
    
    // 获取所有Cookie
    cookies := c.GetReqHeaders()["Cookie"]
    
    return c.JSON(fiber.Map{
        "session": session,
        "token":   token,
        "cookies": cookies,
    })
})

7.2 设置Cookie #

go
app.Get("/set-cookie", func(c *fiber.Ctx) error {
    // 设置Cookie
    c.Cookie(&fiber.Cookie{
        Name:     "session",
        Value:    "abc123",
        Expires:  time.Now().Add(24 * time.Hour),
        HTTPOnly: true,
        Secure:   true,
        SameSite: "Lax",
    })
    
    return c.SendString("Cookie set")
})

7.3 删除Cookie #

go
app.Get("/clear-cookie", func(c *fiber.Ctx) error {
    c.ClearCookie("session")
    return c.SendString("Cookie cleared")
})

八、文件参数 #

8.1 单文件上传 #

go
app.Post("/upload", func(c *fiber.Ctx) error {
    // 获取上传的文件
    file, err := c.FormFile("file")
    if err != nil {
        return err
    }
    
    // 保存文件
    err = c.SaveFile(file, "./uploads/"+file.Filename)
    if err != nil {
        return err
    }
    
    return c.JSON(fiber.Map{
        "filename": file.Filename,
        "size":     file.Size,
        "header":   file.Header,
    })
})

8.2 多文件上传 #

go
app.Post("/uploads", func(c *fiber.Ctx) error {
    // 解析multipart表单
    form, err := c.MultipartForm()
    if err != nil {
        return err
    }
    
    // 获取所有文件
    files := form.File["files"]
    
    var filenames []string
    for _, file := range files {
        err := c.SaveFile(file, "./uploads/"+file.Filename)
        if err != nil {
            return err
        }
        filenames = append(filenames, file.Filename)
    }
    
    return c.JSON(fiber.Map{
        "count":     len(filenames),
        "filenames": filenames,
    })
})

九、参数验证 #

9.1 手动验证 #

go
app.Post("/users", func(c *fiber.Ctx) error {
    var user User
    if err := c.BodyParser(&user); err != nil {
        return c.Status(400).JSON(fiber.Map{
            "error": "Invalid request body",
        })
    }
    
    // 手动验证
    if user.Name == "" {
        return c.Status(400).JSON(fiber.Map{
            "error": "Name is required",
        })
    }
    
    if user.Email == "" {
        return c.Status(400).JSON(fiber.Map{
            "error": "Email is required",
        })
    }
    
    return c.JSON(user)
})

9.2 使用验证器 #

go
type User struct {
    Name  string `json:"name" validate:"required,min=2,max=50"`
    Email string `json:"email" validate:"required,email"`
    Age   int    `json:"age" validate:"required,min=0,max=150"`
}

app.Post("/users", func(c *fiber.Ctx) error {
    var user User
    if err := c.BodyParser(&user); err != nil {
        return c.Status(400).JSON(fiber.Map{
            "error": "Invalid request body",
        })
    }
    
    // 使用validator验证
    validate := validator.New()
    if err := validate.Struct(user); err != nil {
        return c.Status(400).JSON(fiber.Map{
            "error": err.Error(),
        })
    }
    
    return c.JSON(user)
})

十、实战示例 #

10.1 分页参数处理 #

go
type PaginationQuery struct {
    Page     int    `query:"page" validate:"min=1"`
    Limit    int    `query:"limit" validate:"min=1,max=100"`
    Sort     string `query:"sort" validate:"oneof=asc desc"`
    OrderBy  string `query:"order_by"`
    Search   string `query:"search"`
}

func GetPagination(c *fiber.Ctx) (*PaginationQuery, error) {
    query := &PaginationQuery{
        Page:    1,
        Limit:   10,
        Sort:    "asc",
        OrderBy: "id",
    }
    
    if err := c.QueryParser(query); err != nil {
        return nil, err
    }
    
    return query, nil
}

app.Get("/users", func(c *fiber.Ctx) error {
    pagination, err := GetPagination(c)
    if err != nil {
        return c.Status(400).JSON(fiber.Map{
            "error": "Invalid pagination parameters",
        })
    }
    
    return c.JSON(fiber.Map{
        "page":  pagination.Page,
        "limit": pagination.Limit,
        "sort":  pagination.Sort,
    })
})

10.2 综合参数处理 #

go
type PostRequest struct {
    // 路径参数
    UserID string `params:"userId"`
    
    // 查询参数
    Draft bool `query:"draft"`
    
    // 请求体
    Title   string   `json:"title"`
    Content string   `json:"content"`
    Tags    []string `json:"tags"`
}

app.Post("/users/:userId/posts", func(c *fiber.Ctx) error {
    var req PostRequest
    
    // 解析路径参数
    if err := c.ParamsParser(&req); err != nil {
        return err
    }
    
    // 解析查询参数
    if err := c.QueryParser(&req); err != nil {
        return err
    }
    
    // 解析请求体
    if err := c.BodyParser(&req); err != nil {
        return err
    }
    
    return c.JSON(req)
})

十一、总结 #

11.1 参数获取方法汇总 #

方法 用途 示例
c.Params() 路径参数 c.Params(“id”)
c.Query() 查询参数 c.Query(“page”)
c.FormValue() 表单参数 c.FormValue(“name”)
c.BodyParser() JSON/表单解析 c.BodyParser(&user)
c.Get() 请求头 c.Get(“Authorization”)
c.Cookies() Cookie c.Cookies(“session”)
c.FormFile() 上传文件 c.FormFile(“file”)

11.2 下一步 #

现在你已经掌握了路由参数,接下来让我们学习 路由分组,更好地组织你的路由!

最后更新:2026-03-28