最近在研究Go,打算基于Go做點Web API,于是經過初步調研,打算用Beego這個架構,然後再結合其中提供的ORM以及Swagger的內建,可以快速搭建一個RESTful API的網站。
下面是具體做法:
1. 在Ubuntu中安裝Go 1.8
預設Ubuntu apt-get提供的是Go 1.6,而我們要用最新的Go 1.8需要執行以下操作:
1.1 添加apt-get源并重新整理
$ sudo add-apt-repository ppa:gophers/archive
$ sudo apt-get update
1.2 安裝Go 1.8
$ sudo apt-get install golang-1.8
1.3 設定環境變量
等安裝完畢後,Go會被安裝到/usr/lib/go-1.8目錄。我們要執行go指令和建立自己項目的話,需要增加一些環境變量。
我們以後代碼要放在目前使用者下的Go目錄下,需要先建立2個目錄:
$ mkdir -p ~/go/bin
$ mkdir -p ~/go/src
然後設定目前使用者的環境變量:
vi ~/.profile
在結尾增加以下内容:
export GOROOT=/usr/lib/go-1.8
export PATH="$PATH:$GOROOT/bin"
export GOPATH=$HOME/go
export PATH="$PATH:$GOPATH/bin"
儲存後,重新重新整理環境變量
source ~/.profile
接下來我們驗證一下我們的Go版本,輸入
go version
我目前傳回的是go version go1.8.1 linux/amd64說明我們的Go 1.8已經安裝成功
2. 下載下傳Beego、Bee工具和MySQL驅動
Beego是一個非常适合Go初學者的Web架構,提供了很多的功能,有些人說他臃腫,不過對于我這個Go初學者來說,不在乎是否臃腫,而在乎是否快速解決問題,是否簡單。下面我們來安裝Beego,這個很簡單,隻需要執行以下指令:
$ go get -u github.com/astaxie/beego
$ go get -u github.com/beego/bee
其中beego是架構的源代碼,而bee是一個快速建立運作Beego項目的工具。
我們的目标是要實作ORMapping,那麼連接配接資料庫是必不可少的,需要另外下載下傳Go版的MySQL驅動:
$ go get github.com/go-sql-driver/mysql
這些通過go get下載下傳下來的檔案都在~/go/src中,而bee工具是在~/go/bin中。
3. 建立api項目并運作
直接使用bee工具建立一個簡單的RESTful API項目是個不二的選擇,假設我們的項目名字叫testApi,那麼隻需要執行:
bee api testApi
那麼程式就會建立對應的檔案在目錄~/go/src/testApi
接下來我們需要運作這個項目。首先切換到到項目檔案夾,然後運作bee run指令:
cd ~/go/src/testApi
bee run -gendoc=true -downdoc=true
這個時候我們可以看到系統已經運作在8080端口,我們切換到浏覽器,通路這個網站的Swagger位址:
http://192.168.100.129:8080/swagger/就可以看到我們熟悉的Swagger界面了:

4. 修改代碼,實作ORMapping
如果我們來到testApi項目檔案夾,會看到類似MVC的結構,不過由于Web API不需要真正的View, 所有view檔案夾被Swagger替換。下面我們要建立一個Student對象,并實作對Student增删改查的Web API。
4.1 建立Student model和對應的表
我們可以先在MySQL中建立Student表:
CREATE TABLE `student` (
`Id` int(11) NOT NULL,
`Name` varchar(10),
`Birthdate` date ,
`Gender` tinyint(1) ,
`Score` int(11),
PRIMARY KEY (`Id`)
)
然後在model檔案夾下建立Student.go檔案,增加Student對象:
type Student struct {
Id int
Name string
Birthdate string
Gender bool
Score int
}
4.2初始化ORM子產品
我們要通過ORM來操作對象和資料庫,但是ORM需要初始化才能使用,我們需要在main.go檔案中增加以下内容:
import (
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
func init() {
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "zengyi:123@tcp(127.0.0.1:3306)/testdb?charset=utf8")
}
這裡需要注意的是資料庫連接配接字元串和普通的寫法不一樣,要寫成如下格式:
使用者名:密碼@tcp(MySQL伺服器位址:端口)/資料庫名字?charset=utf8
4.3 提供資料庫查詢Student的方法
接下來就是資料庫通路方法了。我們可以仿照user.go一樣,把方法都寫在Student.go檔案裡面。這是完整的Student.go檔案:
package models
import (
"github.com/astaxie/beego/orm"
"fmt"
"time"
)
type Student struct {
Id int
Name string
Birthdate string
Gender bool
Score int
}
func GetAllStudents() []*Student {
o := orm.NewOrm()
o.Using("default")
var students []*Student
q:= o.QueryTable("student")
q.All(&students)
return students
}
func GetStudentById(id int) Student{
u:=Student{Id:id}
o := orm.NewOrm()
o.Using("default")
err := o.Read(&u)
if err == orm.ErrNoRows {
fmt.Println("查詢不到")
} else if err == orm.ErrMissPK {
fmt.Println("找不到主鍵")
}
return u
}
func AddStudent(student *Student) int{
o := orm.NewOrm()
o.Using("default")
o.Insert(student)
return student.Id
}
func UpdateStudent(student *Student) {
o := orm.NewOrm()
o.Using("default")
o.Update(student)
}
func DeleteStudent(id int){
o := orm.NewOrm()
o.Using("default")
o.Delete(&Student{Id:id})
}
func init() {
// 需要在init中注冊定義的model
orm.RegisterModel(new(Student))
}
4.4 建立StudentController對外提供Student的增加、删除、修改、查詢一個、查詢所有的方法
這裡我們也可以仿照usercontroller,直接改寫成我們需要的StudentController.go。這是内容:
package controllers
import "github.com/astaxie/beego"
import (
"testApi/models"
"encoding/json"
)
type StudentController struct {
beego.Controller
}
// @Title 獲得所有學生
// @Description 傳回所有的學生資料
// @Success 200 {object} models.Student
// @router / [get]
func (u *StudentController) GetAll() {
ss := models.GetAllStudents()
u.Data["json"] = ss
u.ServeJSON()
}
// @Title 獲得一個學生
// @Description 傳回某學生資料
// @Param id path int true "The key for staticblock"
// @Success 200 {object} models.Student
// @router /:id [get]
func (u *StudentController) GetById() {
id ,_:= u.GetInt(":id")
s := models.GetStudentById(id)
u.Data["json"] = s
u.ServeJSON()
}
// @Title 建立使用者
// @Description 建立使用者的描述
// @Param body body models.Student true "body for user content"
// @Success 200 {int} models.Student.Id
// @Failure 403 body is empty
// @router / [post]
func (u *StudentController) Post() {
var s models.Student
json.Unmarshal(u.Ctx.Input.RequestBody, &s)
uid := models.AddStudent(&s)
u.Data["json"] = uid
u.ServeJSON()
}
// @Title 修改使用者
// @Description 修改使用者的内容
// @Param body body models.Student true "body for user content"
// @Success 200 {int} models.Student
// @Failure 403 body is empty
// @router / [put]
func (u *StudentController) Update() {
var s models.Student
json.Unmarshal(u.Ctx.Input.RequestBody, &s)
models.UpdateStudent(&s)
u.Data["json"] = s
u.ServeJSON()
}
// @Title 删除一個學生
// @Description 删除某學生資料
// @Param id path int true "The key for staticblock"
// @Success 200 {object} models.Student
// @router /:id [delete]
func (u *StudentController) Delete() {
id ,_:= u.GetInt(":id")
models.DeleteStudent(id)
u.Data["json"] = true
u.ServeJSON()
}
這裡需要注意的是,函數上面的注釋是很重要的,有一定的格式要求,Swagger就是根據這些注釋來展示的,是以必須寫正确。
4.5 将StudentController注冊進路由
現在大部分工作已經完成,我們隻需要把新的StudentController注冊進路由即可,打開router.go,增加以下内容:
beego.NSNamespace("/student",
beego.NSInclude(
&controllers.StudentController{},
),
),
當然對于系統預設的user和object,如果我們不需要,可以注釋掉。
4.6 運作并通過Swagger測試
我們的編碼已經完成。接下來使用bee指令來運作我們的項目:
bee run -gendoc=true -downdoc=true
我們就可以看到我們新的student Controller了。并且可以通過調用API來完成對student表的CRUD操作。
【本文章出自
部落格園深藍居,轉載請注明作者出處,如果您覺得部落客的文章對您有很大幫助,歡迎點選右側打賞按鈕對部落客進行打賞。】
打個招聘廣告,部落客正在主導開發一個跨鍊區塊鍊項目:
PalletOne,一直在招Go程式員,待遇豐厚,坐标北京酒仙橋,希望有識之士加入!