每天開頭依然會先喇賽一下,不過最近真的越來越忙,沒有太多時間可以好好準備鐵人賽,希望很快可以撐過去,來研究研究Beego Routing使用篇吧 !
今天就來研究一下究竟Routing該怎麼設定怎麼寫呢?
通常我們在進入一個網站的時候,第一次訪問的時候都會使用GET來取的整個網頁(HTML),這時候Router會解析URL,並且將指定的controller拿出來使用。
我們以API(beego api Board
)開發為範例
我們再次來看看router.go
這檔案的內容,將主要的init()
拿出來研究
router.go
1 func init() {
2 ns := beego.NewNamespace("/v1",
3 beego.NSNamespace("/object",
4 beego.NSInclude(
5 &controllers.ObjectController{},
6 ),
7 ),
8 beego.NSNamespace("/user",
9 beego.NSInclude(
10 &controllers.UserController{},
11 ),
12 ),
13 )
14 beego.AddNamespace(ns)
15 }
範例程式,先定義一個ns
變數,分別是下面的結構
(Router)
├── /v1
│ └── /object
│ └── /user
...
至於為什麼會用v1我們有機會來談談API設計。
第五行程式碼我們可以看到在Object這層Namespace下面將一個controller放到這裡面去;同樣的道理UserController也被放到 /user
這層的Namespace
什麼是Namespace
當程式越來越龐大的時候,有許多的功能或是class名稱有可能一樣,為了解決這樣的問題有了Namespace這個概念,在每個領域中可以有個字的命名,而且並不會相互衝突,且能夠更清楚理解程式碼。在範例中 Namespace,也有類似的概念,同樣是取得資料,但取得的資料完全不同類型。
我們挑選來看ObjectController
來看,其實程式碼大同小異
package controllers
import (
"Board/models"
"encoding/json"
"github.com/astaxie/beego"
)
type ObjectController struct {
beego.Controller
}
func (o *ObjectController) Post() {
var ob models.Object
json.Unmarshal(o.Ctx.Input.RequestBody, &ob)
objectid := models.AddOne(ob)
o.Data["json"] = map[string]string{"ObjectId": objectid}
o.ServeJSON()
}
func (o *ObjectController) Get() {
objectId := o.Ctx.Input.Param(":objectId")
if objectId != "" {
ob, err := models.GetOne(objectId)
if err != nil {
o.Data["json"] = err.Error()
} else {
o.Data["json"] = ob
}
}
o.ServeJSON()
}
func (o *ObjectController) GetAll() {
obs := models.GetAll()
o.Data["json"] = obs
o.ServeJSON()
}
func (o *ObjectController) Put() {
objectId := o.Ctx.Input.Param(":objectId")
var ob models.Object
json.Unmarshal(o.Ctx.Input.RequestBody, &ob)
err := models.Update(objectId, ob.Score)
if err != nil {
o.Data["json"] = err.Error()
} else {
o.Data["json"] = "update success!"
}
o.ServeJSON()
}
func (o *ObjectController) Delete() {
objectId := o.Ctx.Input.Param(":objectId")
models.Delete(objectId)
o.Data["json"] = "delete success!"
o.ServeJSON()
}
我們必須先將ObjectController
實作成beego.ControllerInterface
,因為我們必須要使用他的方法,在官方的文件中也也說明,文件中也有提到,如果你要使用他們這些func你必須override這些的func。
明天來做簡單小練習吧!