beego 创建 restful 接口应使用 beego.restrouter 一键绑定控制器与 http 方法,控制器需嵌入 web.controller 并以指针接收器定义 get/post/put/delete 方法;必须调用 c.servejson() 输出 json;推荐用 bee api 命令生成项目骨架,并注意 beego v2 的 import 路径、swag 集成及版本一致性。

Beego 创建 RESTful 接口的核心不是“写一堆路由”,而是用 beego.RESTRouter 一键绑定控制器与 HTTP 方法语义,再配合约定好的方法名(Get、Post、Put、Delete)自动分发——只要控制器结构体嵌入 web.Controller,且方法签名符合规范,就直接可用。
用 beego.RESTRouter 注册资源路由,别手写 method 映射
手动对每个 HTTP 方法调用 beego.Router 并指定函数名(如 "get:Get")容易出错,也违背 RESTful 意图。正确做法是使用 beego.RESTRouter,它会自动按请求方法匹配控制器内同名方法:
-
beego.RESTRouter("/api/users", &controllers.UserController{})会把GET /api/users→UserController.Get,POST /api/users→UserController.Post,依此类推 - 控制器必须继承
web.Controller,且方法需为指针接收器:func (c *UserController) Get() - 不支持自定义方法名映射(比如把
GET指向ListAll),如需该能力,改用beego.Router+ 第三个参数字符串(如"get:ListAll")
控制器里处理 JSON 输入输出,别漏掉 ServeJSON()
Beego 不会自动序列化返回值,c.Data["json"] = ... 只是设置数据,必须显式调用 c.ServeJSON() 才能写出 JSON 响应头和 body:
- 错误写法:
c.Data["json"] = map[string]interface{}{"ok": true}→ 返回空响应或 500(取决于是否设置了ContentType) - 正确写法:
c.Data["json"] = ...; c.ServeJSON() -
ServeJSON()默认禁用 JSONP、开启 gzip(若客户端支持),还可传参控制:例如c.ServeJSON(false)关闭 indent 格式化 - 接收 JSON 请求体时,用
c.ParseForm()不生效,应改用c.BeeApp.Handlers或直接读c.Ctx.Input.RequestBody后json.Unmarshal
用 bee api 命令生成项目骨架,别从零写 main.go 和路由
新手常卡在初始化结构上。直接用官方工具生成标准 API 项目,省去配置陷阱:
- 运行
bee api myapp,会生成含controllers/、routers/router.go、main.go的完整目录 -
main.go中已包含beego.Run()和模块初始化逻辑,勿自行替换为web.Run()(那是旧版 v1 写法) - 生成的
routers/router.go默认有beego.RESTRouter示例,删掉注释即可用 - 若要连接数据库并生成 CRUD 控制器,加参数:
bee api myapp -driver=mysql -conn="user:pass@tcp(127.0.0.1:3306)/db",它会自动建models/和带GetOne/GetAll等方法的 controller
调试时注意端口、文档路径和依赖版本冲突
本地跑不起来?大概率是这三个地方没对齐:
- 端口被占:检查
conf/app.conf中的httpport,默认8080;bee run输出日志第一行会显示实际监听地址 - Swagger 文档打不开:新版 Beego v2 不内置 Swagger,需额外集成
swaggo/swag;运行swag init生成docs/后,在main.go中导入_ "myapp/docs"并调用beego.BeeApp.AddRouter("/swagger", &controllers.SwaggerController{})(或用社区封装的中间件) - Go mod 报错:确保
go.mod中 Beego 版本为v2(如github.com/beego/beego/v2 v2.3.4),且bee工具也安装的是 v2 版本(go install github.com/beego/bee/v2@latest),v1 和 v2 混用会导致web.Controller找不到
真正麻烦的从来不是写接口,而是让 bee、go mod、swag 和 Beego v2 的 import 路径全部对上——少一个斜杠、错一个大写、漏一个 /v2,编译就失败,而且错误信息不指向根本原因。











