介绍
我们组服务端使用了Beego框架,使用的相对合理,本篇文章简单聊一下我们是如何使用框架的。
大家如果对Beego框架如果不熟悉,可以先看一下这篇文章 https://beego.me/ ,了解如何使用。
分析
Beego
- Beego设置路由的函数为
1 | func Router(rootpath string, c ControllerInterface, mappingMethods ...string) *App { |
- mappingMethods这个参数用来设置对应 method 到函数名,定义如下
*
表示任意的 method 都执行该函数- 使用 httpmethod:funcname 格式来展示
- 多个不同的格式使用
;
分割 - 多个 method 对应同一个 funcname,method 之间通过
,
来分割
以下是一个 RESTful 的设计示例:
beego.Router(“/api/list”,&RestController{},”*:ListFood”)
beego.Router(“/api/create”,&RestController{},”post:CreateFood”)
- 其中ControllerInterface的结构为:
1 | // ControllerInterface is an interface to uniform all controller handler. |
- 同时Beego的Controller实现了ControllerInterface
1 | // Controller defines some basic http request handler operations, such as |
服务端
- 创建I18nBaseController,组合Beego的Controller,这么做可以导致I18nBaseController实现了Beego的ControllerInterface
1 | type I18nBaseController struct { |
I18nBaseController中重点实现了如下函数:
Init:初始化数据,并生成i18nC(i18nC, ok := app.(I18nControllerInterface))
Prepare:主要处理登录、access/reffer检查等,也会调用i18nC.Setup
Exec:用于调用Process
1
2
3
4func (c *I18nBaseController) Exec() {
defer c.recoverPanic()
c.i18nC.Process()
}
- I18nControllerInterface是接口,所有组合I18nBaseController的类可以重载这些接口
1 | type I18nControllerInterface interface { |
使用
创建类
1
2
3
4
5
6
7
8
9
10
11
12type IndexController struct {
base.I18nBaseController
}
func (c *IndexController) Setup() {
c.InputData.IsNeedLogin = true //默认不需要登录
}
func (c *IndexController) Process() {
c.Data["json"] = "rt"
c.ServeJSON(true)
}
- 这个类里有I18nBaseController,所以也实现了Beego的ControllerInterface
- 实现函数Setup和Process,对I18nBaseController里对应的函数实现了重载
路由
1
2var mappingMethods string = "*:Exec"
beego.Router("/"+applocal+"/accessories", &accessories.IndexController{}, mappingMethods)
mappingMethods意味执行IndexController里的Exec函数,即
func (c *I18nBaseController) Exec() {
defer c.recoverPanic()
c.i18nC.Process()
}最终执行的是IndexController中的Process
- Beego框架
- 以Beego中ServeHTTP为例,会先执行IndexController的Init,然后执行IndexController,最后执行Exec,如此完成了一次请求
总结
本文给大家演示了团队内部是怎样使用Beego框架的,这套使用方案给研发提供了很多灵活性,希望对大家有所帮助。