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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介:

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

本文转自深蓝居博客园博客,原文链接:http://www.cnblogs.com/studyzy/p/6964612.html,如需转载请自行联系原作者


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
7月前
|
XML JSON API
识别这些API接口定义(http,https,api,RPC,webservice,Restful api ,OpenAPI)
本内容介绍了API相关的术语分类,包括传输协议(HTTP/HTTPS)、接口风格(RESTful、WebService、RPC)及开放程度(API、OpenAPI),帮助理解各类API的特点与应用场景。
|
9月前
|
缓存 安全 API
RESTful与GraphQL:电商API接口设计的技术细节与适用场景
本文对比了RESTful与GraphQL这两种主流电商API接口设计方案。RESTful通过资源与HTTP方法定义操作,简单直观但可能引发过度或欠获取数据问题;GraphQL允许客户端精确指定所需字段,提高灵活性和传输效率,但面临深度查询攻击等安全挑战。从性能、灵活性、安全性及适用场景多维度分析,RESTful适合资源导向场景,GraphQL则适用于复杂数据需求。实际开发中需根据业务特点选择合适方案,或结合两者优势,以优化用户体验与系统性能。
|
9月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
8月前
|
缓存 边缘计算 前端开发
从业务需求到技术栈:电商API选型RESTful还是GraphQL?这5个维度帮你决策
在数字经济时代,电商平台的竞争已延伸至用户体验与系统效能。作为连接前后端及各类服务的核心,API接口的架构设计至关重要。本文对比RESTful与GraphQL两大主流方案,从电商场景出发,分析两者的技术特性、适用场景与选型逻辑,帮助开发者根据业务需求做出最优选择。
|
XML JSON API
Understanding RESTful API and Web Services: Key Differences and Use Cases
在现代软件开发中,RESTful API和Web服务均用于实现系统间通信,但各有特点。RESTful API遵循REST原则,主要使用HTTP/HTTPS协议,数据格式多为JSON或XML,适用于无状态通信;而Web服务包括SOAP和REST,常用于基于网络的API,采用标准化方法如WSDL或OpenAPI。理解两者区别有助于选择适合应用需求的解决方案,构建高效、可扩展的应用程序。
|
机器学习/深度学习 设计模式 API
Python 高级编程与实战:构建 RESTful API
本文深入探讨了使用 Python 构建 RESTful API 的方法,涵盖 Flask、Django REST Framework 和 FastAPI 三个主流框架。通过实战项目示例,详细讲解了如何处理 GET、POST 请求,并返回相应数据。学习这些技术将帮助你掌握构建高效、可靠的 Web API。
|
JSON JavaScript 前端开发
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将引导您步入Node.js的奇妙世界,通过实践操作,掌握如何使用这一强大的JavaScript运行时环境构建高效、可扩展的RESTful API。我们将一同探索Express框架的使用,学习如何设计API端点,处理数据请求,并实现身份验证机制,最终部署我们的成果到云服务器上。无论您是初学者还是有一定基础的开发者,这篇文章都将为您打开一扇通往后端开发深层知识的大门。
360 12
|
XML JSON 缓存
深入理解RESTful API设计原则与实践
在现代软件开发中,构建高效、可扩展的应用程序接口(API)是至关重要的。本文旨在探讨RESTful API的核心设计理念,包括其基于HTTP协议的特性,以及如何在实际应用中遵循这些原则来优化API设计。我们将通过具体示例和最佳实践,展示如何创建易于理解、维护且性能优良的RESTful服务,从而提升前后端分离架构下的开发效率和用户体验。
|
监控 安全 API
深入浅出:构建高效RESTful API的最佳实践
在数字化时代,API已成为连接不同软件和服务的桥梁。本文将带你深入了解如何设计和维护一个高效、可扩展且安全的RESTful API。我们将从基础概念出发,逐步深入到高级技巧,让你能够掌握创建优质API的关键要素。无论你是初学者还是有经验的开发者,这篇文章都将为你提供实用的指导和启示。让我们一起探索API设计的奥秘,打造出色的后端服务吧!
|
SQL 缓存 测试技术
构建高性能RESTful API:最佳实践与避坑指南###
—— 本文深入探讨了构建高性能RESTful API的关键技术要点,从设计原则、状态码使用、版本控制到安全性考虑,旨在为开发者提供一套全面的最佳实践框架。通过避免常见的设计陷阱,本文将指导你如何优化API性能,提升用户体验,确保系统的稳定性和可扩展性。 ###
394 12