iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 13
1

還記得昨天我們看到GET的寫法嗎?
我今天又將router.go在寫了一次,這次加上了今天要把POST寫出來讓我們可以透過http的post來達到新增資料的部分,這次的鐵人賽好像也有人在寫關於API的文章,網路上應該也有許多有關http header拿來當api的用法,明天也稍微來寫一篇有關於API是什麼的部分吧!

前情提要

黑絲工程師發現隨著學校名氣越來越大,需要擴充程式的功能,重新寫了router的結構,這次的練習我們也新增了一個class(這裡說得是班級,不是物件導向說的)

routers/router.go

//上方的import沒有變動

func init() {
  namespace := beego.NewNamespace("/ironSchool",
    beego.NSNamespace("/student",
      beego.NSRouter("/", &controllers.StudentController{},"get:GetAll"),
      beego.NSRouter("/", &controllers.StudentController{},"post:PostNewStudent"),
      beego.NSRouter("/:studentId", &controllers.StudentController{},"*:Get"),
    ),
    beego.NSNamespace("/class",
      beego.NSRouter("/", &controllers.ClassController{},"get:GetAllClass"),
      beego.NSRouter("/", &controllers.ClassController{},"post:PostNewClass"),
      beego.NSRouter("/:classId", &controllers.ClassController{},"*:GetById"),
      beego.NSNamespace("/name",
        beego.NSRouter("/:className", &controllers.ClassController{},"*:GetByName"),
      ),
    ),
  )
  beego.AddNamespace(namespace)
}

controllers/student.go

//  新增func
// 前面省略

func (this *StudentController) PostNewStudent() {
  var newStudent models.Student
  this.ParseForm(&newStudent)
  newStudentId := models.AddNewStudent(newStudent)
  this.Data["json"] = map[string]string{"StudentId": newStudentId}
  this.ServeJSON()
}

controllers/class.go

package controllers

import (
  "ironSchool/models"

  "github.com/astaxie/beego"
)

type ClassController struct {
  beego.Controller
}

func (this *ClassController) GetById() {
  classId := this.Ctx.Input.Param(":classId")
  if classId != "" {
    class, err := models.GetClassById(classId)
    if err != nil {
      this.Data["json"] = err.Error()
    } else {
      this.Data["json"] = class
    }
  }
  this.ServeJSON()
}

func (this *ClassController) GetByName() {
  className := this.Ctx.Input.Param(":className")
  if className != "" {
    class, err := models.GetClassByName(className)
    if err != nil {
      this.Data["json"] = map[string]string{"status": err.Error()}
    } else {
      this.Data["json"] = class
    }
  }
  this.ServeJSON()
}

func (this *ClassController) GetAllClass() {
  classes := models.GetAllClasses()
  this.Data["json"] = classes
  this.ServeJSON()
}

func (this *ClassController) PostNewClass() {
  var newClass models.Class
  this.ParseForm(&newClass)
  newClassId := models.AddNewClass(newClass)
  this.Data["json"] = map[string]string{"classId": newClassId}
  this.ServeJSON()
}

幾乎要把所有程式碼都貼上來了,這樣在未來再回來看的時候,比較不會找不到那時候改了什麼地方,這次主要在處理的問題是,在使用BeegoCtx.Input.RequestBody物件時,沒有成功的得到form post的值,這令我很煩惱,上網查了又查,只有發現有人也有一樣的問題,於是我在官方文件上看到可以用ParseForm(),於是就解決了我的問題,如果你在開發的時候也發現輸入fmt.Println(this.Ctx.Input.RequestBody),沒有印出任何的東西,那你可以開始著手檢查了。

  • 首先你可以先檢查你的程式有沒有錯
  • 再來重新下載一個測試的檔案(使用bee api testapi),測試看看官方的範例執行有沒有問題
  • 當你發現官方範例也無法取得你的資料時,你就可以用{ControllerInterface}.ParseForm()這個方法

另外其實官方文件上面,還有許多的方法可以去取得數值,你可以翻翻看文件


減肥專欄

今天下午想去動一動,感覺到了油脂停滯在身體的感覺,其實每天寫鐵人賽,真的時間更少了...

小知識

該不該請健身教練*
這個問題其實我沒有辦法幫你解答,不過我也找過許多的資料,大部分的資料都是一面倒向要請教練,但是除了衡量你的荷包以外,如果你想要健身最好是有一位會健身的朋友不然會有許多的動作可能是在害了你,失去了健身的意義
推薦一個影片,或許對你會有些幫助喔。
10個常見問題告訴你【健身教練的價值】| 健人蓋伊


工程師日常

黑絲工程師:什麼是幹話
雞蛋仔工程師:話很多
檔車工程師:講沒意義的話
大家覺得是什麼咧?


上一篇
Day12 古法私釀、糞扣 Go (BeeGo Framework 練習一)
下一篇
Day14 初次見面 應用程式介面 ApplicationProgrammingInterface (上)
系列文
Go!從無到打造最佳行動網站30

尚未有邦友留言

立即登入留言