beego路由用法
路由文件 router.go
package routers
import (
//引入beego包
"github.com/astaxie/beego"
//用到控制器,需要引入控制器包。hello为项目名称
"hello/controllers"
)
func init() {
//前台首页
beego.Router("/", &controllers.MainController{})
//后台首页
beego.Router("/admin", &controllers.AdminController{},"get:Index")
}
入口文件main.go中引用routers包
package main
import (
"github.com/astaxie/beego"
//路由是必不可少的,入口文件中引入路由包
_ "hello/routers"
)
func main() {
beego.Run()
}
beego四种路由
一、基础路由
beego.Get|Post|Put|Patch|Delete|Head|Options|Any(router, beego.FilterFunc)
例子
beego.Get("/",func(ctx *context.Context){
ctx.Output.Body([]byte("hello world"))
})
beego.Any("/foo",func(ctx *context.Context){
ctx.Output.Body([]byte("bar"))
})
二、RESTful Controller 路由
RESTful 是一种目前 API 开发中广泛采用的形式,是beego 默认支持的请求方法
,也就是用户 Get 请求就执行此路由对应控制器里的 Get 方法,Post 请求就执行此路由对应控制器里的 Post 方法。
beego.Router(router, controller,methods)
beego.Router的功能是映射 URL 到 controller。Router函数源码如下
func Router(rootpath string, c ControllerInterface, mappingMethods ...string) *App {
BeeApp.Handlers.Add(rootpath, c, mappingMethods...)
return BeeApp
}
第一个参数是 URL (用户请求的地址),字符串类型,支持正则
"/" //不带参数
"/?:param" //可带参数 "/"、"/1"、"/name"
"/:param" //必带参数 "/1"、"/name"
"/:id([0-9]+)" //正则数字匹配,参数必须是数字 "/1"
"/:id:int" //等价于"/:id([0-9]+)",是框架实现的
"/:name([\\w]+)" //正则字符串匹配,参数必须是字符串
"/:name:string" //等价于"/:name([\\w]+)",是框架实现的
"/cms_:id([0-9]+).html" //带有前缀的自定义正则 "cms_123.html"
"/*.*" // "/api.tpl" 第一个*匹配api第二个*匹配tpl
"/*" // "/api.tpl" *匹配api.tpl
可以在 Controller 中通过this.Ctx.Input.Params
方式获取上面的变量
this.Ctx.Input.Param(":id")
this.Ctx.Input.Param(":name")
this.Ctx.Input.Param(":ext") //获取后缀名
第二个参数是对应的 Controller
比如controllers包里的MainController方法
&controllers.MainController{}
第三个参数是控制器里的方法
此参数默认是省略的,默认为RESTful风格,即请求的 method 和函数名一致,例如 GET 请求执行 Get 函数,POST 请求执行 Post 函数
如果自定义方法,就需要第三个参数对应 method 到函数名。自定义函数的路由默认不支持 RESTful 的方法。
beego.Router("/",&controllers.MainController{},"post:PostFunc")
如果请求的方法是 POST,那么不会默认去执行 Post 函数,而是执行 PostFunc 函数
格式:"httpmethod:funcname" 支持的HTTP MEthod "get|post|put|patch|delete|head|options|*:funcname"
*表示任意的 method 都执行该函数。如果同时存在 * 和对应的 HTTP Method,那么优先执行 HTTP Method 的方法
"*:AllFunc;post:PostFunc"那么执行 POST 请求的时候,执行 PostFunc 而不执行 AllFunc。
多个不同的格式使用 ; 分割 "get:GetFunc;post:PostFunc"
多个 method 对应同一个 funcname,method 之间通过 , 来分割 "get,post:ApiFunc"
RESTful Controller 路由实例
beego.Router("/",&controllers.MainController{}) //GET|PUT|... 请求分别执行MainController的 Get|Put|... 方法
beego.Router("/?:id([0-9]+)",&controllers.MainController{}) //id为可带参数(若不加?为必带参数),且必须是数字
beego.Router("/",&controllers.ArticleController{}) //GET|PUT|... 请求分别执行ArticleController的 Get|Put|... 方法
beego.Router("/",&controllers.MainController{},"get:Index") //get请求执行MainController的Index方法
beego.Router("/",&controllers.MainController{},"get,post:Index") //get、post请求都执行MainController的Index方法
beego.Router("/",&controllers.MainController{},"get:Show;post:Edit")//get|post分别执行MainController的Show|Edit方法
三、自动路由
把控制器注册到自动路由中,beego 就会通过反射获取该结构体中所有的实现方法
beego.AutoRouter(&controllers.ObjectController{})
/object/login 调用 ObjectController 中的 Login 方法
/object/logout 调用 ObjectController 中的 Logout 方法
/object/blog/2013/09/12 调用 ObjectController 中的 Blog 方法,参数如下:map[0:2013 1:09 2:12]
除了前缀两个 /:controller/:method 的匹配之外,剩下的 url beego 会帮你自动化解析为参数,保存在 this.Ctx.Input.Params
中
四、注解路由
从 beego 1.3 版本开始支持了注解路由
1、router.go 中注册路由(Include 相应地 controller)
beego.Include(&CMSController{})
beego 自动会进行源码分析,注意只会在 dev 模式下进行生成,生成的路由放在 /routers/commentsRouter.go
文件中。
2、在 controller 的 method 方法上面写上 router 注释(// @router)
// CMS API
type CMSController struct {
beego.Controller
}
//如果没有注册URLMapping,那么就会通过反射来执行对应的函数,如果注册了就会通过 interface 来进行执行函数,性能上面会提升很多。
func (c *CMSController) URLMapping() {
c.Mapping("StaticBlock", c.StaticBlock)
c.Mapping("AllBlock", c.AllBlock)
}
// @router /staticblock/:key [get]
func (this *CMSController) StaticBlock() {
}
// @router /all/:key [get]
func (this *CMSController) AllBlock() {
}
上面的路由就支持了如下的路由
GET /staticblock/:key
GET /all/:key
上面注释路由等价于下面的路由
beego.Router("/staticblock/:key", &CMSController{}, "get:StaticBlock")
beego.Router("/all/:key", &CMSController{}, "get:AllBlock")