开发者社区> 深蓝居> 正文

在Ubuntu上快速搭建基于Beego的RESTful API

简介: 最近在研究Go,打算基于Go做点Web API,于是经过初步调研,打算用Beego这个框架,然后再结合其中提供的ORM以及Swagger的集成,可以快速搭建一个RESTful API的网站。 下面是具体做法: 1.
+关注继续查看

最近在研究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

【本文章出自博客园深蓝居,转载请注明作者出处,如果您觉得博主的文章对您有很大帮助,欢迎点击右侧打赏按钮对博主进行打赏。】
打个招聘广告,博主正在主导开发一个跨链区块链项目:PalletOne,一直在招Go程序员,待遇丰厚,坐标北京酒仙桥,希望有识之士加入!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
想将算法进一步开发吗?手把手教你搭建基于CNN模型的Flask Web应用
想将算法进一步开发应用产品吗?本文手把手教你搭建基于CNN模型的Flask Web应用,算是抛砖引玉了。感兴趣的读者可以将自己的算法开发成其他类型的应用产品,说不定下一个人工智能创业公司Boss就是你哦!
5004 0
CentOS 6.3 + Subversion + Usvn 搭建版本管理服务器
一. Subversion 简介 Subversion是一个自由,开源的版本控制系统。在Subversion管理下,文件和目录可以超越时空。Subversion将文件存放在中心版本库里。这个版本库很像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况。
1479 0
从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之七 || API项目整体搭建 6.2 轻量级ORM
代码已上传Github+Gitee,文末有地址   书接上文:《从壹开始前后端分离【 .NET Core2.0 Api + Vue 2.0 + AOP + 分布式】框架之六 || API项目整体搭建 6.1 仓储》,我们简单的对整体项目进行搭建,用到了项目中常见的仓储模式+面向接口编程,核心的一共是六层,当然你也可以根据自己的需求进行扩展,比如我在其他的项目中会用到Common层,当然我们这个项目接下来也会有,或者我还会添加Task层,主要是作为定时项目使用,我之前用的是Task Schedule,基本能满足需求。
1241 0
从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储模式
代码已上传Github+Gitee,文末有地址   书接上文:前几回文章中,我们花了三天的时间简单了解了下接口文档Swagger框架,已经完全解放了我们的以前的Word说明文档,并且可以在线进行调试,而且当项目开始之中,我们可以定义一些空的接口,或者可以返回假数据,这样真正达到了前后端不等待的缺陷,还是很不错的,当然,这离我说的前后端分离还是相差甚远,今天呢,我们就简单搭建下我们的项目架构。
1789 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18989 0
ServiceStack.Hello——跨平台.net REST api服务搭建
ServiceStack.Hello——跨平台.net REST api服务搭建   自己创建: https://github.com/ServiceStack/ServiceStack/wiki/Create-your-first-webservice   直接下载源码: https://github.
1116 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
25229 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20690 0
Python+大数据计算平台,PyODPS架构手把手教你搭建
在2016年10月的云栖社区在线培训上,来自阿里云大数据事业部的秦续业分享了《双剑合壁——Python和大数据计算平台的结合实战》。他主要介绍了数据分析和机器学习的方法、DataFrame整体架构以及基础API、前端、后端、机器学习的具体实现方法。
16614 0
+关注
深蓝居
关注于区块链技术、跨链、密码学、通证经济、智能合约
262
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载