還記得昨天我們看到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()
這個方法另外其實官方文件上面,還有許多的方法可以去取得數值,你可以翻翻看文件