beego执行逻辑
控制器
beego是严格遵循MVC的模式的 所以它的控制器是非常重要的 他的路由注册是有点特别的 它是一个URL前缀对应一个控制器 然后控制器里面定义不同的http methods对应的处理函数
一般声明一个控制器的方法就是自创建一个结构体 包含一个beego.Controller原生的控制器
现在我们来看一下控制器的内部1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30type Controller struct {
// 上下文数据
Ctx *context.Context
// 用来存储一些配置等信息非常方便
Data map[interface{}]interface{}
// 控制器的一些基本介绍信息 名字之类的
controllerName string
actionName string
methodMapping map[string]func() //method:routertree
gotofunc string
AppController interface{}
// 渲染模板信息 模板名字等 这个现在而言不是很重要
TplName string
ViewPath string
Layout string
LayoutSections map[string]string // the key is the section name and the value is the template name
TplPrefix string
TplExt string
EnableRender bool
// 跨域数据
_xsrfToken string
XSRFExpire int
EnableXSRF bool
// session数据
CruSession session.Store
}
所以一个beego控制器中含有以下几部分内容
- 上下文数据
- 控制器基本信息
- 渲染模板信息
- 跨域信息
- session信息
json对象转struct
当路由的方法是post的时候 旺旺需要post一些json对象到后端 那么将他们转为json对象就尤为必要 但是当这个struct结构含有匿名函数的时候需要注意一下
1.当struct没有匿名成员的时候
一切跟平时将json转struct没什么区别 只注意要讲结构体内的成员首字母为大写来声明 不然没有导出的字段是无法被赋值上去的
2.当时结构体含有匿名成员的时候
我们要记住 其实匿名成员里面的所有字段都是直接属于最外面的结构体的 所以我们post表单的时候要注意 不需要给匿名成员提供key 直接将匿名成员里面的字段作为一对key-value对就行了
例如
结构体设计如下1
2
3
4
5
6
7
8
9type User struct {
Desc
Name string `json:"name"`
Id int `json:"id"`
}
type Desc struct {
Num int `json:"num"`
}
那么在postman这边需要这样提交post json对象
结果
copybody bug
这里真的是神坑 浪费了我很多时间 在beego的post路由函数中 我们一般是这样接受发送过来的json对象的1
2
3if err := json.Unmarshal(this.Ctx.Input.RequestBody, &f); err == nil {
//
}
但是有可能一直报错unexpected end of json data json对象的结构不对?但是postman上并没有显示报错啊这就很迷了
实质上是这是因为没有设置copyrequestbody = true 所以post过去的数据一直都是空的 但是我的配置文件上一直有这句话啊 比较坑的是 其实配置文件并没有被加载进去 beego没有加载了你的配置文件 而是加载了默认的配置文件 比较坑的是beego并没有报错说配置文件找不到 所以copyrequestbody一直为false
解决方法是在运行配置那里修改working directory修改为beego项目的根目录 这样beego就可以找到你的配置文件的正确目录了
真的是神坑 beego找不到配置文件目录竟然不会报错。。。