Routing 就路由,一般在 web framework 裡就是指定義路徑與處理函式的對應關係,今天就是要介紹 BeeGo 的 Routing。在前面其實我們已經使用了,只是沒有多做介紹。
BeeGo 裡是統一使用 Router 來定義,有這幾種類別:
最基本的 router,可以用來描述路徑是對應到 controller 的哪個函式。
beego.Router("/api/list",&RestController{},"*:ListFood")
beego.Router("/api/create",&RestController{},"post:CreateFood")
beego.Router("/api/update",&RestController{},"put:UpdateFood")
第一個參數是路徑,第二個參數是 Controller 的指標,第三個參數是表示哪個 HTTP method 要對應 Controller 裡的哪個函式。
以上面的範例程式為例
那麼,可以做複合的指定嗎?答案是可以的
beego.Router("/api",&RestController{},"get,post:ApiFunc")
beego.Router("/simple",&SimpleController{},"get:GetFunc;post:PostFunc")
上面的第一行,就是指 GET /api 或 POST /api 都是由 RestController 的 ApiFunc() 來處理。
第二行,是指 GET /simple 由 SimpleController 的 GetFunc() 來處理,POST /simple 由 SimpleController 的 PostFunc() 來處理。
RegexRouter 主要是處理路徑參數 (URL parameter) 用的,這是指,如果路徑裡有一部份是參數值,可以用 regex 來比對並解析出參數,讓後續的函式來使用。
beego.Router(“/api/?:id”, &controllers.RController{})
上面這行就是指當路徑是 /api/123 的時候,會由 RController 來處理。
Controller 裡的函式,可以使用 this.Ctx.Input.Param(":id") 來取得 123
AutoRouter 比較特別,主要是直接把網址的最後一個位置映射為 Controller 的函式。
例如
beego.AutoRouter(&AdminController{})
這會試著做兩件事情:
綜合前兩者的資訊,加到 router 裡。最終的結果大致就是在網址列輸入 /admin/list 時,會呼叫 AdminController 的 list 方法。
AutoRouter 底層是呼叫 BeeGo router.go 裡的 AddAutoPrefix(),使用 AddAutoPrefix 可以不必一定是 /admin ,例如
beego.AddAutoPrefix("/admin",&MainContorller{})
當存取 /admin/main/list 時,會是呼叫 MainController 的 list 函式。