iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 11
1
Modern Web

Go!從無到打造最佳行動網站系列 第 11

Day11 純、手工系列 Go (BeeGo Routing 使用篇)

  • 分享至 

  • xImage
  •  

每天開頭依然會先喇賽一下,不過最近真的越來越忙,沒有太多時間可以好好準備鐵人賽,希望很快可以撐過去,來研究研究Beego Routing使用篇吧 !

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。

明天來做簡單小練習吧!


上一篇
Day10 純、手工系列 Go (BeeGo Routing概念篇)
下一篇
Day12 古法私釀、糞扣 Go (BeeGo Framework 練習一)
系列文
Go!從無到打造最佳行動網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言