Beego返回JSON响应的基础实现
Beego框架的控制器内置了处理JSON响应的方法,不需要开发者手动拼接JSON字符串再设置响应头,通过框架提供的能力可以快速返回标准JSON数据。首先需要在控制器中定义要返回的数据结构,然后调用对应的方法完成响应。

定义返回数据结构
通常我们会定义一个通用的响应结构体,统一前后端交互的数据格式,方便前端统一处理响应结果。结构体中可以包含状态码、提示信息、具体数据等字段。
package models
// 通用JSON响应结构体
type JsonResponse struct {
Code int `json:"code"` // 业务状态码
Message string `json:"message"` // 提示信息
Data interface{} `json:"data"` // 具体返回数据
}
控制器中返回JSON
Beego的Controller提供了ServeJSON方法,调用该方法后框架会自动将设置的数据转换为JSON格式,并设置Content-Type为application/json。在调用ServeJSON之前,需要将要返回的数据赋值给控制器的Data属性中的json键。
package controllers
import (
"github.com/astaxie/beego"
"your_project_name/models"
)
type UserController struct {
beego.Controller
}
// 获取用户列表接口
func (c *UserController) GetUserList() {
// 模拟查询到的用户数据
userList := []map[string]interface{}{
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 28},
}
// 构造响应数据
resp := models.JsonResponse{
Code: 200,
Message: "获取成功",
Data: userList,
}
// 设置json键的值为响应数据
c.Data["json"] = resp
// 调用ServeJSON返回JSON响应
c.ServeJSON()
}
处理前端AJAX调用的常见问题
中文乱码问题
Beego默认返回的JSON编码是UTF-8格式,正常情况下不会出现中文乱码,如果出现乱码,可以在控制器初始化时设置编码格式,确保响应使用UTF-8编码。
func (c *UserController) Prepare() {
// 设置响应编码为UTF-8
c.Controller.Prepare()
c.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
}
跨域问题处理
当前端和后端不在同一个域名下时,AJAX请求会遇到跨域限制,需要在Beego中设置跨域响应头,允许前端域名的请求访问接口。
func (c *UserController) Prepare() {
c.Controller.Prepare()
// 允许所有域名访问,生产环境可以替换为具体的前端域名
c.Ctx.Output.Header("Access-Control-Allow-Origin", "*")
// 允许的请求方法
c.Ctx.Output.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
// 允许的请求头
c.Ctx.Output.Header("Access-Control-Allow-Headers", "Content-Type, Authorization")
// 如果是OPTIONS预检请求,直接返回成功
if c.Ctx.Request.Method == "OPTIONS" {
c.Ctx.ResponseWriter.WriteHeader(200)
return
}
}
前端AJAX调用示例
前端可以使用原生JavaScript或者jQuery等库发起AJAX请求,获取Beego返回的JSON数据,以下是原生JavaScript的调用示例。
// 发起获取用户列表的AJAX请求
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://127.0.0.1:8080/user/list", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
// 解析返回的JSON数据
var result = JSON.parse(xhr.responseText);
if (result.code === 200) {
console.log("获取到的用户列表:", result.data);
} else {
console.log("请求失败:", result.message);
}
}
};
xhr.send();
注意事项
- 不要手动调用
json.Marshal序列化数据后直接写入响应体,这样容易导致响应头设置不正确,优先使用框架提供的ServeJSON方法。 - 结构体的字段如果想要在JSON中显示不同的键名,需要添加
json标签,否则会使用字段的默认名称。 - 返回的数据如果是时间类型,默认序列化后是时间戳格式,如果需要返回指定格式的时间字符串,可以在结构体中自定义时间字段的序列化逻辑。
- 生产环境中跨域配置不要直接使用
*允许所有域名,应该设置为具体的前端域名,避免安全风险。