beego的路由配置


beego的路由配置

beego 存在三种方式的路由: 固定路由正则路由自动路由


路由定义文件

routers/router.go

基本路由

最简单的 beego 路由由 URI闭包函数组成。


    
    基本 GET 路由
        beego.Get("/",func(ctx *context.Context){
             ctx.Output.Body([]byte("hello world"))
        })
    基本 POST 路由
        beego.Post("/alice",func(ctx *context.Context){
             ctx.Output.Body([]byte("bob"))
        })
    注册一个可以响应任何 HTTP 的路由
        beego.Any("/foo",func(ctx *context.Context){
             ctx.Output.Body([]byte("bar"))
        })
    所有的支持的基础函数如下所示
        beego.Get(router, beego.FilterFunc)
        beego.Post(router, beego.FilterFunc)
        beego.Put(router, beego.FilterFunc)
        beego.Patch(router, beego.FilterFunc)
        beego.Head(router, beego.FilterFunc)
        beego.Options(router, beego.FilterFunc)
        beego.Delete(router, beego.FilterFunc)
        beego.Any(router, beego.FilterFunc)



固定路由 (全匹配的路由)

    beego.Router("/", &controllers.MainController{})
    beego.Router("/admin", &admin.UserController{})
    beego.Router("/admin/index", &admin.ArticleController{})
    beego.Router("/admin/addpkg", &admin.AddController{})

正则路由


        beego.Router(/api/?:id, &controllers.RController{})
        默认匹配 //匹配 /api/123 :id = 123 可以匹配 /api/ 这个URL
        
        beego.Router(/api/:id, &controllers.RController{})
        默认匹配 //匹配 /api/123 :id = 123 不可以匹配 /api/ 这个URL
        
        beego.Router(/api/:id([0-9]+), &controllers.RController{})
        自定义正则匹配 //匹配 /api/123 :id = 123
        
        beego.Router(/user/:username([\\w]+), &controllers.RController{})
        正则字符串匹配 //匹配 /user/astaxie :username = astaxie
        
        beego.Router(/download/*.*, &controllers.RController{})
        *匹配方式 //匹配 /download/file/api.xml :path= file/api :ext=xml
        
        beego.Router(/download/ceshi/*, &controllers.RController{})
        *全匹配方式 //匹配 /download/ceshi/file/api.json :splat=file/api.json
        
        beego.Router(/:id:int, &controllers.RController{})
        int 类型设置方式匹配 :id为int 类型框架帮你实现了正则 ([0-9]+)
        
        beego.Router(/:hi:string, &controllers.RController{})
        string 类型设置方式匹配 :hi  string 类型框架帮你实现了正则 ([\w]+)
        
        beego.Router(/cms_:id([0-9]+).html, &controllers.CmsController{})
        带有前缀的自定义正则 //匹配 :id 为正则类型。匹配 cms_123.html 这样的 url :id = 123
        
        
        可以在 Controller 中通过如下方式获取上面的变量
        
        this.Ctx.Input.Param(":id")
        this.Ctx.Input.Param(":username")
        this.Ctx.Input.Param(":splat")
        this.Ctx.Input.Param(":path")
        this.Ctx.Input.Param(":ext")



指定方法的路由

上面列举的是默认的请求方法名(请求的 method 和函数名一致,例如 GET 请求执行 Get 函数,POST 请求执行 Post函数),

如果用户期望自定义函数名,那么可以使用如下方式:


    beego.Router("/",&IndexController{},"*:Index")
    使用第三个参数第三个参数就是用来设置对应 method 到函数名定义如下
    
    *表示任意的 method 都执行该函数
    使用 httpmethod:funcname 格式来展示
    多个不同的格式使用 ; 分割
    多个 method 对应同一个 funcnamemethod 之间通过 , 来分割



以下是一个 RESTful 的设计示例:


    beego.Router("/api/list",&RestController{},"*:ListFood")
    beego.Router("/api/create",&RestController{},"post:CreateFood")
    beego.Router("/api/update",&RestController{},"put:UpdateFood")
    beego.Router("/api/delete",&RestController{},"delete:DeleteFood")

以下是多个 HTTP Method 指向同一个函数的示例:


    beego.Router("/api",&RestController{},"get,post:ApiFunc")


以下是不同的 method 对应不同的函数,通过 ; 进行分割的示例:


    beego.Router("/simple",&SimpleController{},"get:GetFunc;post:PostFunc")

    
    可用的 HTTP Method
    
    *: 包含以下所有的函数
    get: GET 请求
    post: POST 请求
    put: PUT 请求
    delete: DELETE 请求
    patch: PATCH 请求
    options: OPTIONS 请求
    head: HEAD 请求


如果同时存在 * 和对应的 HTTP Method,那么优先执行 HTTP Method 的方法,例如同时注册了如下所示的路由:


    beego.Router("/simple",&SimpleController{},"*:AllFunc;post:PostFunc")
    那么执行 POST 请求的时候执行 PostFunc 而不执行 AllFunc


注解路由

从 beego 1.3 版本开始支持了注解路由,用户无需在 router 中注册路由,只需要 Include 相应地 controller,然后在 controller 的 method 方法上面写上 router 注释(// @router)


        
        // CMS API
        type CMSController struct {
            beego.Controller
        }
        
        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() {
        
        }


可以在 router.go 中通过如下方式注册路由:



    beego.Include(&CMSController{})
    
    beego 自动会进行源码分析注意只会在 dev 模式下进行生成生成的路由放在 /routers/commentsRouter.go 文件中
    这样上面的路由就支持了如下的路由
    GET /staticblock/:key
    GET /all/:key


其实效果和自己通过 Router 函数注册是一样的:

    beego.Router("/staticblock/:key", &CMSController{}, "get:StaticBlock")
    beego.Router("/all/:key", &CMSController{}, "get:AllBlock")

Buy me a 肥仔水!