Fiber 很实用的一点,是它把“从请求里把数据捞出来”做得很顺。
你既可以手动取:
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
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 文档给出了清晰优先级:
URI 参数
> Body
> Query
> Header
> Cookie也就是说:
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 的绑定不像某些框架那样“强声明即强规范”。
它更像:
- 先帮你把货从不同入口装到同一张货单
- 至于这张货单是否合法,要看你是否配置校验器
这就引出下一章。