必须用 fiber.New() 启动,禁用 fiber.Default();注册 app.Get("/ping", handler) 并访问 /ping(非 /ping/),handler 返回 nil,用 :3001 端口并 log.Fatal(app.Listen()) 启动,确保响应体与状态码可达。

直接用 fiber.New() 启动,别碰 fiber.Default() —— 后者默认带日志中间件,一上线就写满磁盘,TTFB 拖慢 0.5ms 以上。
怎么写一个能跑通的 GET 接口
最简验证不是“Hello World”,而是确保路由注册、启动、请求三步全通。重点不是返回什么,而是能不能拿到响应体和正确状态码。
- 路径必须显式声明:注册
app.Get("/ping", handler),访问/ping才行;访问/ping/会 404(StrictRouting: true默认开启) - handler 必须返回
error:哪怕只是return nil,否则 Fiber 认为处理失败,返回 500 - 启动端口不能被占用:本地测试优先用
:3001或:8080,避开可能被 IDE 或其他服务占的:3000 - 别在
main()里直接app.Listen()后就退出——要加log.Fatal()包裹,否则进程静默退出,你以为跑起来了其实没监听
怎么验证 POST 接口是否真正解析了 JSON
c.BodyParser() 看似自动,但不设 Content-Type: application/json 头就会静默失败,字段全为零值,还不报错。
- 测试时用
curl -H "Content-Type: application/json" -d '{"name":"test"}' http://localhost:3001/user,缺头就解析失败 - 结构体字段必须首字母大写 +
json:"name"tag,小写字段反射不可见,永远拿不到值 - 别依赖
err != nil判断解析成功——BodyParser只在反序列化崩溃时才报错,空对象、非法类型、缺失字段它都默默接受 - 验证是否真解析:在 handler 里加
log.Printf("parsed: %+v", user),看输出是不是你传的值
为什么 c.Params("id") 返回空字符串却没报错
Fiber 的 :id 是纯字符串捕获,不做任何格式校验或非空检查,/user/ 会把 id 设为空串,/user//abc 会捕获 " "(带空格)。
- 必须手动判空:
if id := c.Params("id"); id == "" { return c.Status(400).Send("id required") } - 数字 ID 要自己转:
strconv.Atoi(c.Params("id")),失败就返回 400,别让 panic 泄露到外层 - 正则校验别放每次请求里:
regexp.Compile开销大,提前用regexp.MustCompile编译好再复用 - 多个参数共用校验逻辑?抽成中间件,但注意顺序:必须放在路由 handler 前,否则白写
最容易被忽略的是:所有校验逻辑都得在 handler 或中间件里显式写,Fiber 不会自动拦截空字符串、前后空格、嵌套字段一致性——比如密码和确认密码比对,validate:"eqfield=Password" 在嵌套结构里根本无效,得自己用反射取值比对。











