用beego开发服务端应用

  1. *: 包含以下所有的函数,优先级低于下面的方法
  2. get: GET 请求
  3. post: POST 请求
  4. put: PUT 请求
  5. delete: DELETE 请求
  6. patch: PATCH 请求
  7. options: OPTIONS 请求
  8. head: HEAD 请求

自动注册路由

另外还有beego.AutoRouter($controllers.ObjectController{}),会自动通过反射为Object中的方法生成路由。

通过注解注册路由

在controller的方法上面加上router注释,router.go中通过beego.Include(&Controller)引入controller的时候会自动注册路由。

例如:

  1. // CMS API
  2. type CMSController struct {
  3. beego.Controller
  4. }
  5. func (c *CMSController) URLMapping() {
  6. c.Mapping('StaticBlock', c.StaticBlock)
  7. c.Mapping('AllBlock', c.AllBlock)
  8. }
  9. // @router /staticblock/:key [get]
  10. func (this *CMSController) StaticBlock() {
  11. }
  12. // @router /all/:key [get]
  13. func (this *CMSController) AllBlock() {
  14. }

然后在router.go中:

beego.Include(&CMSController{})

beego会自动进行源码分析,如果是dev模式,会在routers/commentXXX.go文件。

使用namespace管理路由

namespace支持前套,并且可以对包含其中对路由进行前置过滤、条件判断。

namespace接口如下:

  1. NewNamespace(prefix string, funcs …interface{}) 初始化 namespace 对象
  2. NSCond(cond namespaceCond) 支持满足条件才namespace
  3. NSBefore(filiterList …FilterFunc)
  4. NSAfter(filiterList …FilterFunc)
  5. NSInclude(cList …ControllerInterface)
  6. NSRouter(rootpath string, c ControllerInterface, mappingMethods …string)
  7. NSGet(rootpath string, f FilterFunc)
  8. NSPost(rootpath string, f FilterFunc)
  9. NSDelete(rootpath string, f FilterFunc)
  10. NSPut(rootpath string, f FilterFunc)
  11. NSHead(rootpath string, f FilterFunc)
  12. NSOptions(rootpath string, f FilterFunc)
  13. NSPatch(rootpath string, f FilterFunc)
  14. NSAny(rootpath string, f FilterFunc)
  15. NSHandler(rootpath string, h http.Handler)
  16. NSAutoRouter(c ControllerInterface)
  17. NSAutoPrefix(prefix string, c ControllerInterface)

示例:

  1. //初始化 namespace
  2. ns :=
  3. beego.NewNamespace('/v1',
  4. beego.NSCond(func(ctx *context.Context) bool {
  5. if ctx.Input.Domain() == 'api.beego.me' {
  6. return true
  7. }
  8. return false
  9. }),
  10. beego.NSBefore(auth),
  11. beego.NSGet('/notallowed', func(ctx *context.Context) {
  12. ctx.Output.Body([]byte('notAllowed'))
  13. }),
  14. beego.NSRouter('/version', &AdminController{}, 'get:ShowAPIVersion'),
  15. beego.NSRouter('/changepassword', &UserController{}),
  16. beego.NSNamespace('/shop',
  17. beego.NSBefore(sentry),
  18. beego.NSGet('/:id', func(ctx *context.Context) {
  19. ctx.Output.Body([]byte('notAllowed'))
  20. }),
  21. ),
  22. beego.NSNamespace('/cms',
  23. beego.NSInclude(
  24. &controllers.MainController{},
  25. &controllers.CMSController{},
  26. &controllers.BlockController{},
  27. ),
  28. ),
  29. )
  30. //注册 namespace
  31. beego.AddNamespace(ns)

注册了以下的路由:

  1. GET /v1/notallowed
  2. GET /v1/version
  3. GET /v1/changepassword
  4. POST /v1/changepassword
  5. GET /v1/shop/123
  6. GET /v1/cms/ 对应 MainController、CMSController、BlockController 中得注解路由

需要特别注意的NSAfter()

NSAfter()注册的filter函数会在请求处理结束的时候被调用,但是要注意在bee 1.9.0中:

beego.NSAfter does not work after controller.ServeJSON

相关的issue:

注解路由无法进入NSBefore controller.ServeJSON should work will with beego.NSAfter

可以用github: study-beego里的的代码试验一下。

使用数据库

beego仿照Digango ORM和SQLAlchemy实现beego ORM,当前支持三个驱动:

  1. MySQL:github.com/go-sql-driver/mysql
  2. PostgreSQL:github.com/lib/pq
  3. Sqlite3:github.com/mattn/go-sqlite3

beego生成的model文件中,会自动将model注册到orm,例如:

bee generate model user -fields='name:string,age:int'

生成的代码models/user.go中会在init()中注册:

  1. func init() {
  2. orm.RegisterModel(new(User))
  3. }

因此只需要手工书写orm初始化的代码,譬如在main.go中:

  1. func init() {
  2. orm.RegisterDataBase('default', 'mysql', 'root:@tcp(127.0.0.1:3306)/mysql?charset=utf8', 30)
  3. }

数据库迁移(migration)

数据库迁移功能可以数据库进行升级、回滚操作。

生成迁移文件,user是表名,fields是表结构:

bee generate migration user -driver=mysql -fields='name:string,age:int'

运行后,生成了文件:

  1. |____database
  2. | |____migrations
  3. | | |____20171024_154037_user.go

在数据库中创建了名为study-beego的数据库后,执行下面的命令:

bee migrate -driver=mysql -conn='root:@tcp(127.0.0.1:3306)/study-beego'

study-beego中的表将会被创建或者更新,并在名为migrations的表中记录更新。

migrate的子命令refreshrollback执行失败,原因不明。

beego.Controller处理http请求

注意,在1.9.0中,需要在配置中设置copyrequestbody=true以后,c.Ctx.Input.RequestBody中才有数据。

  1. func (c *UserController) Post() {
  2. var v models.User
  3. json.Unmarshal(c.Ctx.Input.RequestBody, &v)
  4. fmt.Println(v)
  5. if _, err := models.AddUser(&v); err == nil {
  6. c.Ctx.Output.SetStatus(201)
  7. c.Data['json'] = v
  8. } else {
  9. c.Data['json'] = err.Error()
  10. }
  11. c.ServeJSON()
  12. }
(0)

相关推荐