beego之路由

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")
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容