beego之路由

2018-10-14  本文已影响131人  高鸿祥

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")
上一篇下一篇

猜你喜欢

热点阅读