公共方法一般放入基类控制器中,如果你没有则可以创建一个base.go并在其中写入一个BaseController作为基类控制器:
package controllers
import (
"github.com/astaxie/beego"
)
type BaseController struct {
beego.Controller
}
type JsonReturn struct {
Msg string `json:"msg"`
Code int `json:"code"`
Data interface{} `json:"data"` //Data字段需要设置为interface类型以便接收任意数据
//json标签意义是定义此结构体解析为json或序列化输出json时value字段对应的key值,如不想此字段被解析可将标签设为`json:"-"`
}
func (c *BaseController) ApiJsonReturn(msg string,code int,data interface{}) {
var JsonReturn JsonReturn
JsonReturn.Msg = msg
JsonReturn.Code = code
JsonReturn.Data = data
c.Data["json"] = JsonReturn //将结构体数组根据tag解析为json
c.ServeJSON() //对json进行序列化输出
c.StopRun() //终止执行逻辑
}
然后在需要使用此方法的控制器中继承此基类控制器即可,这里需要注意的是基类控制器中的方法名首字母需要大写,否则其他控制器无法访问。
这里我使用IndexController作为演示继承此基类控制器并调用方法来返回调用API获取到的Json数据:
数据表结构和数据在之前的文章有提到:点我查看
package controllers
import (
"github.com/astaxie/beego/orm"
)
type IndexController struct {
BaseController
}
type UserDb struct {
Id int `json:"id" orm:"column(id)"`
Account string `json:"account" orm:"column(account)"`
Password string `json:"password" orm:"column(password)"`
CreateTime int `json:"create_time" orm:"column(create_time)"`
UpdateTime int `json:"update_time" orm:"column(update_time)"`
Status int `json:"status" orm:"column(status)"`
//json标签意义是定义此结构体解析为json或序列化输出json时value字段对应的key值,如不想此字段被解析可将标签设为`json:"-"`
//orm的column标签意义是将orm查询结果解析到此结构体时每个结构体字段对应的数据表字段名
}
func (c *IndexController) Test(){
var user []UserDb
o := orm.NewOrm()
_, err := o.Raw("SELECT * FROM user").QueryRows(&user) //将查询结果解析到结构体中,对应方式参考结构体中标签说明
if err==nil{
c.ApiJsonReturn("请求成功",200,user) //调用基类控制器中的方法以返回Json数据
}
}
接下来使用Postman请求IndexController中的Test方法查看请求API得到的Json数据:
这里我注册了自动路由,可以通过 ”控制器名/方法名“ 直接访问,以下是route.go中注册方式:
package routers
import (
"github.com/astaxie/beego"
"testbeego/controllers"
)
func init() {
beego.AutoRouter(&controllers.IndexController{})
}