選擇beego是由於它文檔比較全, 選擇xorm是由於我用了好久,並且它真的很好用.web
web應用中,用的最多的仍是 json的請求和返回.json
參考jas的風格, API的返回值,規定以下, 若是請求成功. 返回api
{"error": null, "data": ...}
失敗返回app
{"error": "why failed..", "data": ...}
先假設有個struct叫User, 已經初始化 var x *xorm.Engine
框架
type User struct { ID int64 `json:"id" xorm:"id pk autoincr"` Name string `json:"name"` }
beego中的路由規則函數
beego.Router("/api/template/save", &controllers.UserController{}, "post:save") beego.Router("/api/template/all", &controllers.UserController{}, "get:All") beego.Router("/api/template/:id(\d+)", &controllers.UserController{}) // GET + PUT + DELETE
conf/app.conf中增長一行 autorender=falsepost
APIController這個東西是從beego.Controller繼承過來的東東.ui
type APIController struct { beego.Controller err error data interface{} } // 函數結束時,組裝成json結果返回 func (this *APIController) Finish() { r := struct { Error interface{} `json:"error"` Data interface{} `json:"data"` }{} if this.err != nil { r.Error = this.err.Error() } r.Data = this.data this.Data["json"] = r this.ServeJson() } // 若是請求的參數不存在,就直接 error返回 func (this *APIController) MustString(key string) string { v := this.GetString(key) if v == "" { this.Data["json"] = map[string]string{ "error": fmt.Sprintf("require filed: %s", key), "data": "orz!!", } this.ServeJson() this.StopRun() } return v } // 其餘的函數跟它累似,就不寫了
Create + Update = Savethis
// for /api/user/create func (v *User) Create() error { _, err = x.Insert(v) return err } // for /api/user/update func UpdateUser(id int64, v *User) error { affec, err := x.Id(id).Update(v) if err == nil && affec == 0 { err = errors.New("update user error") } return err } // for /api/user/save func (v *User) Save() error { if v.ID == 0 { return v.Create() } return UpdateUser(id, v) } // for /api/user/all func AllUser() (vs[]User, err error{ err = x.Find(&vs) return } // for /api/user/delete func DelUser(id int64) error { affec, err := x.Id(id).Delete(new(User)) if err == nil && affec == 0 { err = errors.New("already deleted") } this.err = err }
type UserController struct { APIController } // Save func (this *UserController) Save() { v := new(models.User) v.ID = this.MustInt64WithDefault("id", 0) v.Name = this.MustString("name") this.err = v.Save() } // Put func (this *UserController) Put(){ v := new(models.User) v.ID = this.MustInt64(":id") v.Name = this.MustString("name") this.err = v.Save() } // All func (this *UserController) All(){ this.data, this.err = models.AllUser() } // Delete func (this *UserController) Delete(){ id := this.MustInt64(":id") this.err = models.DeleteUser(id) }