美文网首页
beego之路由

beego之路由

作者: 高鸿祥 | 来源:发表于2018-10-14 19:01 被阅读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")
    

    相关文章

      网友评论

          本文标题:beego之路由

          本文链接:https://www.haomeiwen.com/subject/xydtzftx.html