iT邦幫忙

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

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

Day13 古法私釀、糞扣 Go (BeeGo Framework 練習二)

  • 分享至 

  • xImage
  •  

還記得昨天我們看到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()這個方法

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


上一篇
Day12 古法私釀、糞扣 Go (BeeGo Framework 練習一)
下一篇
Day14 初次見面 應用程式介面 ApplicationProgrammingInterface (上)
系列文
Go!從無到打造最佳行動網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言