Fiber不自动合并参数,c.Params()、c.QueryParam()、c.FormValue()和c.BodyParser()各管一摊,混用必为空;路径未显式声明:id,c.Params("id")永远返回空字符串。

直接说结论:Fiber 不自动合并参数,c.Params()、c.QueryParam()、c.FormValue() 和 c.BodyParser() 各管一摊,混用必为空;路径没显式声明 :id,c.Params("id") 永远返回空字符串。
路径参数必须在路由里写 :name 才能用 c.Params()
Fiber 不做“智能识别”,它只认你在注册路由时明确写出的占位符。没写,就取不到。
-
app.Get("/user/:id", handler)→c.Params("id")可取值,如请求/user/123返回"123" -
app.Get("/user/{id}", handler)或app.Get("/user/:id/", handler)→ 404,Fiber 不识别花括号或末尾斜杠(StrictRouting默认开启) -
app.Get("/files/*", handler)→ 用c.Params("*")取整个尾部,如/files/a/b/c返回"a/b/c" - 别在 goroutine 或 map 里直接存
c.Params("id")的返回值——它是内部字节切片引用,下个请求复用该fiber.Ctx对象时内容就变了;要存必须先转成string或用utils.CopyString()
查询参数用 c.QueryParam(),不是 c.Params() 也不是 c.Query()
c.QueryParam("key") 和 c.Params("key") 完全无关,底层内存不共享,名字撞车也不影响彼此取值。
- URL 是
/post/abc?format=json&slug=go:
-c.Params("slug")→"abc"(前提是路由为/post/:slug)
-c.QueryParam("format")→"json"
-c.QueryParam("slug")→ 空(query string 里没slug=)
-c.Params("format")→ 空(路径里没声明:format) - 推荐统一用
c.QueryParam(),它对缺失 key 返回空字符串,而c.Query()在 key 不存在时会 panic
请求体参数必须按 Content-Type 选对方法
Fiber 不自动解析请求体,你发什么类型,就得用对应方法读;错配会导致空值、panic 或静默失败。
- 表单提交(
application/x-www-form-urlencoded)→ 用c.FormValue("field"),多值用c.FormValues("tags") - JSON 请求体 → 用
c.BodyParser(&v),结构体字段需带json:"name"tag;别用c.FormValue()去读 JSON 字段 - 文件上传 → 用
c.FormFile("file")+c.SaveFile();别用c.Body()手动读,会破坏 multipart 解析状态 - 原始 body →
c.Body()只能调一次;若需多次使用(比如中间件日志 + handler 解析),先拷贝再用bytes.NewReader()重置
PUT/DELETE 请求 404 或 405?先看 Network 面板里 Method 到底是什么
浏览器原生 <form method="put"> 是无效的,HTML 规范只认 get 和 post,写了也白写,退化成 GET。这不是 Fiber 的问题。
- 真 PUT/DELETE 必须用 JS 发:fetch、axios、XMLHttpRequest
-
404= 路由路径或方法完全没注册,比如写了app.Put("/user", ),但请求是PUT /users -
405= 路径存在,但方法不匹配,比如只注册了app.Post("/user", ),却用 PUT 访问 - 跨域带
Authorization等自定义 Header 时,浏览器会先发 OPTIONS 预检;没配cors.New(),预检就卡住,Network 面板只看到失败的 OPTIONS 请求
最常被忽略的是 c.Params() 和 c.Body() 的生命周期——它们返回的不是新分配的字符串或字节切片,而是复用对象内部缓冲区的引用。一旦离开当前 handler,这些值随时可能被下一个请求覆盖。需要持久化,就得手动拷贝。

















