使用xorm和beego快速生成REST-API應用(只寫了一半的文章)

框架選擇

選擇beego是由於它文檔比較全, 選擇xorm是由於我用了好久,並且它真的很好用.web

beego的API設計

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
  1. 使用命令bee生成的基礎的beego框架
  2. 新建的APIController
  3. 完善models中的邏輯
  4. 完善controllers中的REST接口

相關的代碼

生成beego的框架 - 先pass

conf/app.conf中增長一行 autorender=falsepost

APIController

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
}
// 其餘的函數跟它累似,就不寫了

xorm中的CRUD操做

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
}

beego中的Controller操做

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)
}
相關文章
相關標籤/搜索