1. 程式人生 > >談談Go語言的Restful介面開發

談談Go語言的Restful介面開發

前言:
如今微服務、無伺服器架構大行其道。而API開發是這些話題的主角。 Go語言開發效率要比Java Spring要快一些,效能上比PHP高出一個數量級。尤其是Go語言在併發方便非常的優秀,是接下來值得關注的一門語言。 本人近來學習go語言,想基於Go做Web API,經過調研,打算用Beego這個框架,然後再結合其中提供的ORM以及Swagger的整合,可以快速搭建一個RESTful API的網站。

1.在centos上安裝go,詳情請看

Go語言環境的安裝

2. 下載Beego、Bee工具和MySQL驅動

主要涉及的內容:

API開發框架Beego
API開發工具Bee
Go語言mysql驅動

依賴包

 $ go get -u github.com/astaxie/beego
 $ go get -u github.com/beego/bee
 $ go get github.com/go-sql-driver/mysql

這裡需要注意的是,因為下載得框架原始碼這些基本是從github上下載下來的,需要通過git指令,所以要先通過git -version檢視該系統是否已安裝git,如果沒有安裝,則通過yum –y install git 進行安裝。

3. 建立模板api專案並執行

直接使用bee工具建立一個簡單的RESTful API專案,專案名字叫testApi,執行:

bee api testApi

那麼程式就會建立對應的檔案在目錄~/golang/code/src/testApi
接下來我們需要執行這個專案。首先切換到到專案資料夾,然後執行bee run命令:

cd ~/golang/code/src/testApi
bee run -gendoc=true -downdoc=true

這個時候我們可以看到系統已經執行在8080埠,我們切換到瀏覽器,訪問這個網站的Swagger地址:
對應伺服器IP地址:8080/swagger/(如果是阿里雲伺服器,要開放8080埠)
在這裡插入圖片描述

4. 修改程式碼,實現對資料庫操作

我們要新建一個Student物件,並實現對Student增刪改查的Web API。

新建Student model和對應的表

我們先在MySQL中建立Student表:

CREATE TABLE `student` ( 
  `id` int(11) NOT NULL, 
  `name` varchar(10), 
  `birthday ` date , 
  `sex` tinyint(1) 
  PRIMARY KEY (`Id`) 
)

然後在model資料夾下新建Student.go檔案,增加Student物件:

   type Student struct {
            Id       int
            Name     string
            BirthDay string
            Sex      bool
           }

初始化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", 使用者名稱,密碼@tcp(對應IP地址:資料庫對應埠號)/資料庫名字?charset=utf8")
}

其中default為資料庫連線的一個別名,後面需要用到

提供資料庫查詢Student的方法
package models

import (
        "github.com/astaxie/beego/orm"
        "fmt"
)
func init() {
orm.RegisterModel(new (Student))
}

type Student struct {
        Id       int
        Name     string
        BirthDay string
        Sex      bool
       }
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(s *Student) int{
  o:=orm.NewOrm()
  o.Using("default")
  o.Insert(s)
  return s.Id
}
func UpdateStudent(s *Student){
o:=orm.NewOrm()
o.Using("default")
o.Update(s)
}
func DeleteStudent(id int){
o:=orm.NewOrm()
o.Using("default")
o.Delete(&Student{Id:id})

}
建立StudentController對外提供Student的增加、刪除、修改、查詢一個、查詢所有的方法
package controllers

import (
        "encoding/json"
        
        "github.com/astaxie/beego"
)       
type StudentController struct {
        beego.Controller
o}      

// @Title addStudent
// @Description create students
// @Param       body            body    models.Student  true            "body for student content"
// @Success 200 {int} models.Student.Id 
// @router / [post]
func (u *StudentController) AddStudent() {
        var student  models.Student
        json.Unmarshal(u.Ctx.Input.RequestBody, &student)
        uid := models.AddStudent(&student)
        u.Data["json"] = map[string]int{"uid": uid}
        u.ServeJSON()
}       

// @Title 獲得所有學生
// @Description 返回所有的學生資料
// @Success 200 {object} models.Student
// @router / [get]
        students := models.GetAllStudents()
        u.Data["json"] = students
        u.ServeJSON()
}       

// @Title getStudentById
// @Description get student  by uid
// @Param       uid             path    string  true            "The key for staticblock"
// @Success 200 {object} models.Student 
// @Failure 403 :uid is empty
// @router /:id [get]
func (u *StudentController) GetStudentById() {
                student := models.GetStudentById(uid)
                u.Data["json"] = student
                u.ServeJSON()
}               
// @Title updateStudent
// @Description update the student
// @Param       uid             path    string  true            "The uid you want to update"
// @Param       body            body    models.Student  true            "body for student content"
// @Success 200 {object} models.Student 
// @Failure 403 :uid is not int
// @router / [put]
func (u *StudentController) UpdateStudent() {
                var student models.Student
                json.Unmarshal(u.Ctx.Input.RequestBody, &student)
                 models.UpdateStudent(&student)
                u.Data["json"] = student
                u.ServeJSON()
}               

// @Title deleteStudent
// @Description delete the student
// @Param       uid             path    string  true            "The uid you want to delete"
// @Success 200 {string} delete success!
// @Failure 403 uid is empty
// @router /:id [delete]
func (u *StudentController) DeleteStudent() {
        uid ,_:= u.GetInt(":id")
        models.DeleteStudent(uid)
        u.Data["json"] = "delete success!"
        u.ServeJSON()
}  
將StudentController註冊進路由

現需要把新的StudentController註冊進路由即可,開啟router.go,增加以下內容:
beego.NSNamespace("/student",
beego.NSInclude(
&controllers.StudentController{},
),
),

執行並通過Swagger測試

接下來使用bee命令來執行我們的專案:
bee run -gendoc=true -downdoc=true
我們就可以看到我們新的student Controller了。並且可以通過呼叫API來完成對student表的CRUD操作。
在這裡插入圖片描述

以上是本人利用go語言進行api開發的實踐小案例,大家也可以嘗試下看看。發現有錯誤的,希望指出!