[轉]GO 開發rest api 接口


注明出處:https://blog.csdn.net/haowenqi008/article/details/79150705

最近在研究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界面了:

image

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操作。

image

文章標簽: G


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM