全书目录

第三十三篇:Fiber 完全指南 —— 极简高压快线城区宇宙

第九章:参数、Body、Bind —— 货单装卸系统

1 分钟 252 字 第 620 / 962 个阅读单元

Fiber 很实用的一点,是它把“从请求里把数据捞出来”做得很顺。

你既可以手动取:

go
app.Get("/users/:id", func(c fiber.Ctx) error {
    id := c.Params("id")
    page := c.Query("page", "1")
    lang := c.Get("Accept-Language")
    return c.JSON(fiber.Map{
        "id":   id,
        "page": page,
        "lang": lang,
    })
})

也可以直接绑定到结构体。


#1. 只绑 Body
go
type CreateUserReq struct {
    Name  string `json:"name" form:"name"`
    Email string `json:"email" form:"email"`
}

app.Post("/users", func(c fiber.Ctx) error {
    req := new(CreateUserReq)

    if err := c.Bind().Body(req); err != nil {
        return err
    }

    return c.Status(fiber.StatusCreated).JSON(req)
})

#2. 把多来源一起绑进来

官方 Bind().All 文档给出了清晰优先级:

text
URI 参数
  > Body
  > Query
  > Header
  > Cookie

也就是说:

go
type SearchReq struct {
    ID        int    `uri:"id" json:"id" query:"id"`
    Keyword   string `json:"keyword" query:"keyword"`
    UserRole  string `header:"X-User-Role"`
    SessionID string `cookie:"session_id"`
}

app.Post("/search/:id", func(c fiber.Ctx) error {
    req := new(SearchReq)

    if err := c.Bind().All(req); err != nil {
        return err
    }

    return c.JSON(req)
})

这里你要有明确心智:

Bind().All 不是“瞎混合”,而是按固定覆盖顺序做装车。


#3. Fiber 的绑定哲学

Fiber 的绑定不像某些框架那样“强声明即强规范”。

它更像:

  • 先帮你把货从不同入口装到同一张货单
  • 至于这张货单是否合法,要看你是否配置校验器

这就引出下一章。