前言:
如今微服务、无服务器架构大行其道。而API开发是这些话题的主角。 Go语言开发效率要比Java Spring要快一些,性能上比PHP高出一个数量级。尤其是Go语言在并发方便非常的优秀,是接下来值得关注的一门语言。 本人近来学习go语言,想基于Go做Web API,经过调研,打算用Beego这个框架,然后再结合其中提供的ORM以及Swagger的集成,可以快速搭建一个RESTful API的网站。
Go语言环境的安装
主要涉及的内容:
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
进行安装。
直接使用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端口)
我们要新建一个Student对象,并实现对Student增删改查的Web API。
我们先在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
}
复制代码
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为数据库连接的一个别名,后面需要用到
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})
}
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注册进路由即可,打开router.go,增加以下内容:
beego.NSNamespace("/student",
beego.NSInclude(
&controllers.StudentController{},
),
),
接下来使用bee命令来运行我们的项目:
bee run -gendoc=true -downdoc=true
我们就可以看到我们新的student Controller了。并且可以通过调用API来完成对student表的CRUD操作。
以上是本人利用go语言进行api开发的实践小案例,大家也可以尝试下看看。发现有错误的,希望指出!