谈谈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端口)
谈谈Go语言的Restful接口开发_第1张图片

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语言的Restful接口开发_第2张图片

以上是本人利用go语言进行api开发的实践小案例,大家也可以尝试下看看。发现有错误的,希望指出!

你可能感兴趣的:(Go语言学习)