前言
REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。 他在论文中提到:"我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST指的是一组架构约束条件和原则。" 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。
REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。
总结就是,RestfulApi 是一种流行的 API 设计风格,可以让接口含义更加清晰,更简洁,更有层次,可维护性更高
下面就就简单基于 Express 设计一个 Restful 结构的 Api
设计原则
在这之前说一下原则,接口尽量不包含动词,而是一种资源,举例,设计一个用户的相关接口,包括,
- 获取用户列表
- 获取用户详情
- 添加用户
- 更新用户信息
- 删除用户信息
一般设计接口名称 往往会加入动词 get 、add、 up、 del
- 获取用户列表 /getUserList
- 获取用户详情 /getUserDetail
- 添加用户 /addUser
- 更新用户信息 /upDataUser
- 删除用户信息 /delUser
因为资源标识一种实体,所以应该是名词,URI 不应该有动词,动词应该放在http协议中中,例如 get post put delete
所以正确的命名应该是
id代表用户唯一标识
功能 | URI | 请求方式 |
---|---|---|
获取用户列表 | /user | get |
获取用户详情 | /user/:id | get |
添加用户 | /user | post |
更新用户信息 | /user | put |
删除用户信息 | /user/:id | delete |
这样是不是简洁明了,只用到一个关键字,user
实例
基于之前的一篇文章 基础架构搭建 Express-MVC 创建了获取用户列表的,下面再接着依次实现 新增用户、获取详情、更新用户、删除用户 的api
获取用户列表
获取用户列表接口 不在介绍,想了解请看 Express-MVC
新增用户
添加路由
代码语言:node复制router.post('/user', user.created)
user 控制器下添加create 方法
代码语言:node复制// 添加用户
async function create(req, res, next){
let result = await UserModel.create(req.body);
if(result){
res.send({
code: 200,
data:result,
msg:'创建成功'
})
}
}
获取用户详情
添加路由
代码语言:node复制router.get('/user/:id', user.created)
user 控制器下添加show 方法
代码语言:node复制// 获取用户详情
async function show(req, res, next){
let result = await UserModel.findOne({
where: {
id:req.params.id
}
})
if(result){
res.send({
code: 200,
data:result,
msg:'查询成功成功'
})
}
}
删除用户
添加路由
代码语言:node复制router.delete('/user/:id', user.del)
user 控制器下添加del 方法
代码语言:node复制// 删除用户
async function del(req, res, next){
let result = await UserModel.destroy({where:{
id: req.params.id
}});
if(result){
res.send({
code: 200,
data:result,
msg:'删除成功'
})
}
}
更新用户信息
添加路由
代码语言:node复制router.put('/user/:id', user.del)
user 控制器下添加update 方法
代码语言:node复制// 修改用户数据
async function update(req, res, next){
let result = await UserModel.update({
age: req.body.age,
name:req.body.name
},{where:{
id: req.body.id
}});
if(result){
res.send({
code: 200,
data:result,
msg:'修改成功'
})
}
}