第十二单元(Beego框架路由)
<h1>beego 路由配置</h1>
<pre><code>从 beego 1.2 版本开始支持了基本的 RESTful 函数式路由,应用中的大多数路由都会定义在 `routers/router.go` 文件中。最简单的 beego 路由由 URI 和闭包函数组成。</code></pre>
<h3>1.1 基本GET路由</h3>
<pre><code>package routers
import (
"beetest/controllers"
"github.com/astaxie/beego"
"github.com/astaxie/beego/context"
)
func init() {
beego.Get("/hello", func(ctx *context.Context) {
ctx.Output.Body([]byte("hello world"))
})
}</code></pre>
<h3>1.2 基本 POST 路由</h3>
<pre><code>beego.Post("/alice",func(ctx *context.Context){
ctx.Output.Body([]byte("bob"))
})
beego.Router("/test/:id", &controllers.TestController{}, "post:Post")
func (this *TestController) Post() {
id := this.Ctx.Input.Param(":id")
this.Ctx.WriteString(id)
}</code></pre>
<h3>1.3 注册一个可以响应任何 HTTP 的路由</h3>
<pre><code>beego.Any("/foo",func(ctx *context.Context){
ctx.Output.Body([]byte("bar"))
})</code></pre>
<h3>1.4 路由自动匹配</h3>
<pre><code>beego.AutoRouter(&controllers.ObjectController{})
用户首先需要把需要路由的控制器注册到自动路由中:
beego.AutoRouter(&controllers.ObjectController{})
那么 beego 就会通过反射获取该结构体中所有的实现方法,你就可以通过如下的方式访问到对应的方法中:
/object/login 调用 ObjectController 中的 Login 方法
/object/logout 调用 ObjectController 中的 Logout 方法</code></pre>
<h3>1.5 正则路由</h3>
<pre><code>### 2.2.3 正则路由
为了用户更加方便的路由设置,beego 参考了 sinatra 的路由实现,支持多种方式的路由:
- beego.Router(“/api/?:id”, &controllers.RController{})
默认匹配 例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123”
- beego.Router(“/api/:id”, &controllers.RController{})
默认匹配 //例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123”,但URL”/api/“匹配失败
- beego.Router(“/api/:id([0-9]+)“, &controllers.RController{})
自定义正则匹配 //例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123”
- beego.Router(“/user/:username([\\w]+)“, &controllers.RController{})
正则字符串匹配 //例如对于URL”/user/astaxie”可以匹配成功,此时变量”:username”值为”astaxie”
- beego.Router(“/download/*.*”, &controllers.RController{})
*匹配方式 //例如对于URL”/download/file/api.xml”可以匹配成功,此时变量”:path”值为”file/api”, “:ext”值为”xml”
- beego.Router(“/download/ceshi/*“, &controllers.RController{})
*全匹配方式 //例如对于URL”/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
</code></pre>
<pre><code>可以在 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")</code></pre>
<pre><code></code></pre>
<h3>2.2.4 路由命名空间</h3>
<pre><code>ns :=
beego.NewNamespace("/v1",
beego.NSNamespace("/shop",
beego.NSGet("/:id", func(ctx *context.Context) {
ctx.Output.Body([]byte("shopinfo"))
}),
),
beego.NSNamespace("/order",
beego.NSGet("/:id", func(ctx *context.Context) {
ctx.Output.Body([]byte("orderinfo"))
}),
),
beego.NSNamespace("/crm",
beego.NSGet("/:id", func(ctx *context.Context) {
ctx.Output.Body([]byte("crminfo"))
}),
),
)</code></pre>
<pre><code>
> 请求URL
GET /v1/shop/13
GET /v1/order/123
GET /v1/crm/123</code></pre>