基于beego开发RESTfulAPI项⽬
go语⾔作为c语⾔同⽗异母的兄弟在后端服务器开发⽅⾯表现出了其惊⼈的天赋,出⽣记为⾼并发、多核⼼⽽⽣。
beego是华⼈谢⼤神借鉴tornado、sinatra 和 flask 这三个框架的精髓⽽设计的⼀个框架,该框架可以帮助⼈们来快速开发API、web、以及后端服务应⽤。
站在巨⼈的肩膀上,也同时作为学习go的具体实战项⽬,从beego开始创建⼀个基于前后端分离的web项⽬。
[帮助]
安eego
beego直接通过go get安装,bee ⼯具是⼀个为了协助快速开发 beego 项⽬⽽创建的项⽬,通过 bee 您可以很容易的进⾏ beego项⽬的创建、热编译、开发、测试、和部署。
本项⽬将基于bee创建⼀个api⼯程,开发IDE采⽤goland(⽀持正版,你懂得)
$ go get -u github/astaxie/beego
$ go get -u github/beego/bee
创建API⼯程
创建⼀个xxxx的⼯程:
$bee api xxxx
下⾯运⾏该⼯程,-gendoc=true 表⽰每次⾃动化的 build ⽂档,-downdoc=true 就会⾃动的下载 swagger ⽂档查看器:
$bee run -gendoc=true -downdoc=true
设计接⼝API
RESTful API的特点
基于“资源”,数据也好、服务也好,在RESTFul设计⾥⼀切都是资源。
⽆状态。⼀次调⽤⼀般就会返回结果,不存在类似于“打开连接-访问数据-关闭连接”这种依赖于上⼀次调⽤的情况。
URL中通常不出现动词,只有名词
URL语义清晰、明确
使⽤HTTP的GET、POST、DELETE、PUT来表⽰对于资源的增删改查
使⽤JSON不使⽤XML
RESTful风格的接⼝设计尽量遵循以下原则
参考:
使⽤HTTP动词表⽰增删改查资源, GET:查询,POST:新增,PUT:更新,DELETE:删除
返回结果必须使⽤JSON
HTTP状态码,在REST中都有特定的意义:200,201,202,204,400,401,403,500。⽐如401表⽰⽤户⾝份认证失败,403表⽰你验证⾝份通过了,但这个资源你不能操作
如果出现错误,返回⼀个错误码
mysql帮助文档API必须有版本的概念,v1,v2,v3
使⽤Token令牌来做⽤户⾝份的校验与权限分级,⽽不是Cookie
url中⼤⼩写不敏感,不要出现⼤写字母
使⽤ - ⽽不是使⽤ _ 做URL路径中字符串连接
有⼀份漂亮的⽂档
撰写API⽂档
API⽂档撰写有很多开源的⼯具,我使⽤的是showdoc(⽀持api接⼝编写和数据字典编写),⽀持在线编写和⾃⼰独⽴部署。
设计接⼝⽰例:
简要描述:
banner
请求URL:
/api/v1.0/banner
请求⽅式:
GET
参数:
参数名必选类型说明
name是string banner名
banner名参数
⾸页homepage
页⾯⼆page2
页⾯三page3
返回⽰例
{
"errno": 0,
"errmsg" "成功",
"data": {
"total": 1,
"list":
[
{
"image_url": "",
"title": "",
"content": "!"
"link": ""
}
]
}
}
返回参数说明
参数名类型说明
total int banner的总数量
image_url string图⽚地址
title string banner标题
content string banner⽂本
备注
更多返回错误代码请看⾸页的错误代码描述
设计数据模型
如果说接⼝⽂档是是对项⽬中所有功能的的梳理,是前后端开发的纽带,那么数据模型则是整个项⽬开发过程中的基⽯,数据模型设计的好坏直接关系到项⽬的优劣,包括可维护性、架构合理性、多模块的协作性。
1. 创建数据字典
数据库设计规范
需注意的数据库设计原则
规则 1:弄清楚将要开发的应⽤程序是什么性质的(OLTP 还是 OPAP)?
规则 2:将你的数据按照逻辑意义分成不同的块,让事情做起来更简单
规则 3:不要过度使⽤ “规则 2”
规则 4:把重复、不统⼀的数据当成你最⼤的敌⼈来对待
规则 5:当⼼被分隔符分割的数据,它们违反了“字段不可再分”
规则 6:当⼼那些仅仅部分依赖主键的列
规则 7:仔细地选择派⽣列
规则 8:如果性能是关键,不要固执地去避免冗余
规则 9:多维数据是各种不同数据的聚合
规则 10:将那些具有“名值表”特点的表统⼀起来设计
规则 11:⽆限分级结构的数据,引⽤⾃⼰的主键作为外键
设计数据字典⽰例
banner表,存储banner信息
字段类型空默认注释
id bigint否主键name varchar(50)否名称image varchar(255)否内容title varchar(255)是NULL标题content varchar(255)是NULL内容备注:⽆
2. 设计beego数据结构模型
beego的MVC模型从⼯程结构上分为controllers、models、views;routers⽬录提供了接⼝的路由信息。
controllers:接⼝服务的具体实现,通常为业务的具体实现;
models:数据模型,往往和数据库的设计直接相关;
beego的数据结构设计时,通过传⼊初始值从⽽实现ORM框架的表结构创建及检查,具体可以参考
vim
添加以下内容
/* table_name = banner */
type Banner struct {
Id int64 `json:"user_id"` //banner id
Name string `orm:"size(50)" json:"name"` //banner name
Image string `orm:"size(255)" json:"image"` //banner image url
Title string `orm:"size(255)" json:"title"` //banner titile
Content string `orm:"size(255)" json:"content"` //banner content
}
3. beegode的ORM模型定义详解
默认的表名规则,使⽤驼峰转蛇形。也可以通过func (u *User) TableName() string {return "auth_user"}⾃定义表名。
AuthUser -> auth_user
Auth_User -> auth__user
DB_AuthUser -> d_b__auth_user
⾃定义索引(具体参考))
⾃定义引擎(仅⽀持MYSQL,具体参考)
设置参数
orm:"null;rel(fk)" 多个设置间使⽤ ; 分隔,设置的值如果是多个,使⽤ , 分隔
忽略字段 AnyField string orm:"-"``
auto,Id 的 Field 将被视为⾃增健
pk 设置为主键,适⽤于⾃定义其他类型为主键
null 默认为 NOT NULL,设置 null 代表 ALLOW NULL
index 为单个字段增加索引
unique 为单个字段增加 unique 键
unique 为单个字段增加 unique 键
column 为字段设置 db 字段的名称,Name string `orm:"column(user_name)"`
size string 类型字段默认为 varchar(255),Title string `orm:"size(60)"`
digits / decimals 设置 float32, float64 类型的浮点精度,总长度 12 ⼩数点后 4 位 eg: 99999999.9999 Money float64 `orm:"digits(12);decimals(4)"`
auto_now / auto_now_add
auto_now 每次 model 保存时都会对时间⾃动更新
auto_now_add 第⼀次保存时才设置时间
Created time.Time >`orm:"auto_now_add;type(datetime)"`
Updated time.Time >`orm:"auto_now;type(datetime)"`
type
设置为 date 时,time.Time 字段的对应 db >类型使⽤ date
Created time.Time >`orm:"auto_now_add;type(date)"`
设置为 datetime 时,time.Time 字段的对应 db >类型使⽤ datetime
Created time.Time >`orm:"auto_now_add;type(datetime)"`
default 为字段设置默认值,类型必须符合(⽬前仅⽤于级联删除时的默认值), Status int `orm:"default(1)"`表关系设置
外键始终在⼦表上
rel / reverse
RelOneToOne:
type User struct {
...
Profile *Profile `orm:"null;rel(one);on_delete(set_null)"`
...
}
对应的反向关系 RelReverseOne:
type Profile struct {
...
User *User `orm:"reverse(one)"`
...
}
RelForeignKey:
type Post struct {
...
User *User `orm:"rel(fk)"` // RelForeignKey relation
...
}
对应的反向关系 RelReverseMany:
type User struct {
...
Posts []*Post `orm:"reverse(many)"` // fk 的反向关系
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论