iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 11
0

Routing 就路由,一般在 web framework 裡就是指定義路徑與處理函式的對應關係,今天就是要介紹 BeeGo 的 Routing。在前面其實我們已經使用了,只是沒有多做介紹。

BeeGo 裡是統一使用 Router 來定義,有這幾種類別:

  • Fixed router
  • Regex router
  • Auto router

Fixed 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 裡的哪個函式。

以上面的範例程式為例

  1. 不管是 GET/POST/PUT/DELETE/HEAD /api/list ,都是由 RestController 裡的 ListFood() 來處理。
  2. POST /api/create ,是由 RestController 的 CreateFood() 來處理
  3. PUT /api/update ,是由 RestController 的 UpdateFood() 來處理

那麼,可以做複合的指定嗎?答案是可以的

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

RegexRouter 主要是處理路徑參數 (URL parameter) 用的,這是指,如果路徑裡有一部份是參數值,可以用 regex 來比對並解析出參數,讓後續的函式來使用。

beego.Router(“/api/?:id”, &controllers.RController{})

上面這行就是指當路徑是 /api/123 的時候,會由 RController 來處理。

Controller 裡的函式,可以使用 this.Ctx.Input.Param(":id") 來取得 123

AutoRouter

AutoRouter 比較特別,主要是直接把網址的最後一個位置映射為 Controller 的函式。

例如

beego.AutoRouter(&AdminController{})

這會試著做兩件事情:

  1. 使用 Reflect 取得 Controller 名稱,然後取得前面不是 Controller 的部份,也就是 admin。
  2. 使用 Reflect 取得 AdminController 的所有函式

綜合前兩者的資訊,加到 router 裡。最終的結果大致就是在網址列輸入 /admin/list 時,會呼叫 AdminController 的 list 方法。

AutoRouter 底層是呼叫 BeeGo router.go 裡的 AddAutoPrefix(),使用 AddAutoPrefix 可以不必一定是 /admin ,例如

beego.AddAutoPrefix("/admin",&MainContorller{})

當存取 /admin/main/list 時,會是呼叫 MainController 的 list 函式。

參考資料


上一篇
Form and CSRF(2)
下一篇
Cache
系列文
BeeGo30

尚未有邦友留言

立即登入留言