Beego默认不自动解析JSON请求体,需配置copyrequestbody=true并用json.Unmarshal手动解析,返回必须调用ServeJSON();结构体字段须首字母大写且带正确json标签,禁用ParseForm处理JSON。

Beego 默认不自动解析 application/json 请求体,this.Ctx.Input.RequestBody 为空或 this.ParseForm() 失败,都是因为没配对配置 + 没手动反序列化。
必须开启 copyrequestbody = true
Beego 默认丢弃原始请求体,即使你发了 JSON,this.Ctx.Input.RequestBody 也是空 slice。这个行为不能靠重启热重载修复,必须改配置并重启进程。
- 在
conf/app.conf中添加一行:copyrequestbody = true - 确保不是写在注释里,也不能有拼写错误(比如写成
copy_request_body) - 修改后必须完整重启 Beego 应用,否则配置不生效
结构体字段要导出且带 json tag
Go 的 json.Unmarshal 只能设置首字母大写的导出字段,小写字段(如 taxpayer_id string)永远收不到值;没有 json:"taxpayer_id" 标签,字段名对不上也会被忽略。
- 字段名必须首字母大写,例如
TaxpayerID *string而非taxpayer_id string - 嵌套结构体也要同样处理,比如微信开票接口里的
seller_info对应字段得是SellerInfo SellerInfo `json:"seller_info"` - 可选字段建议用指针类型(
*string,*int64),避免零值覆盖业务逻辑判断
别用 ParseForm 处理 JSON 请求
this.ParseForm(&v) 是为 application/x-www-form-urlencoded 或表单 multipart 设计的,对 JSON body 完全无效,强行调用会返回 EOF 或静默失败。
- 收到 JSON 请求时,直接跳过
ParseForm,改用json.Unmarshal(this.Ctx.Input.RequestBody, &req) - 如果同时支持表单和 JSON,需先检查
this.Ctx.Request.Header.Get("Content-Type")是否含application/json - 禁用
EnableJsonUnmarshal(Beego 2.x 默认开启,1.x 才需设)——它只影响ReadJSON方法,不影响手动Unmarshal,别混淆
返回 JSON 必须调用 ServeJSON()
只把数据塞进 this.Data["json"] 不够,Beego 不会自动序列化并设 Content-Type。不调用 ServeJSON(),前端大概率收到 HTML 或纯文本响应。
- 务必以
this.ServeJSON()结尾,不能只写this.Data["json"] = xxx - 若结构体已用
//easyjson:json生成加速代码,ServeJSON()会自动走 easyjson 路径,无需额外操作 - 避免返回
map[string]interface{}或interface{}类型——它们无法触发 easyjson,且易因类型擦除导致字段丢失
最常被忽略的是 copyrequestbody = true 配置没生效,以及结构体字段未导出却以为能绑定成功。这两个点一错,整个 JSON 接收链就断了,日志里还看不出明显报错。











