Restful 规范
# Restful 规范
# 概述
Rest:
- Representational State Transfer 的简称
- 代表的是一种软件架构风格,基于 HTTP、URL、XML、JSON 等标准和协议,支持轻量级、跨平台、跨语言的架构设计
作用:通过一套统一的接口为所有 Web 相关提供服务,实现前后端分离
# Rest 设计原则
# 规范原则:
- 每一个 URL 代表一种资源
- 同一种资源有多种表现形式(XML/JSON)
- 所以操作都是无状态的
- 规范统一接口
- 返回一致的数据格式
- 可缓存(客户端可以缓存响应的内容)
# 理解为什么所有的操作需要无状态:
- 基于 C/S 架构的 HTTP 请求本身是无状态的,向客户端发的每一次请求都必须带有充分的信息能够让服务器识别
- 请求信息一般包含在 URL 的查询参数或 Header 中,服务端能够根据请求参数,不需要报错客户端的状态,直接将数据返回
无状态的优点:
可以大大提高服务器的健壮性和扩展性
# 理解规范统一的接口:
Rest 接口约束定义:
- 资源识别
通过 URL 表示要操作的资源
- 请求动作
通过请求动作(HTTP Method)标识要执行的操作
- 响应信息
通过返回的状态码标识这次请求的执行结果
举个例子:
对数据进行增删改查,设计接口
未使用 Rest 规范前:
需要设计 4 个接口,XXX/api/add、XXX/api/delete、XXX/api/query、XXX/api/update,难维护
使用 Rest 规范:
只需要设计一个接口 XXX/api,使用不同的请求方式 GET、POST 、DELETE、PUT,维护方便
# 理解返回一致的数据格式:
服务端返回的数据可以是 XML 或 JSON 或直接返回状态码
返回 JSON 数据:
返回错误的数据格式:
{
"code": 401,
"status": "error",
"message": '用户没有权限',
"data": null
}
正确的数据格式可以如下:
{
"code": 200,
"status": "success",
"data": [{
"userName": "tugenhua",
"age": 31
}]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# URL 及参数设计规范
# URL 设计规范
- URL 末尾不需要出现斜杠/
- 在 URL 中使用 / 是表达层级关系的
- 在 URL 中可以使用连接符 - 来提升可读性
- 在 URL 中不允许出现下划线 _
- 在 URL 中尽量使用小写字符
- 在 URL 中不允许出现文件扩展名、
- 在 URL 中使用复数形式
接口设计对比:
未使用规范前,接口形式不固定:
http://xxx.com/api/getallUsers; // GET请求方式,获取所有的用户信息
http://xxx.com/api/getuser/1; // GET请求方式,获取标识为1的用户信息
http://xxx.com/api/user/delete/1 // GET、POST 删除标识为1的用户信息
http://xxx.com/api/updateUser/1 // POST请求方式 更新标识为1的用户信息
http://xxx.com/api/User/add // POST请求方式,添加新的用户
使用规范后:
http://xxx.com/api/users; // GET请求方式 获取所有用户信息
http://xxx.com/api/users/1; // GET请求方式 获取标识为1的用户信息
http://xxx.com/api/users/1; // DELETE请求方式 删除标识为1的用户信息
http://xxx.com/api/users/1; // PATCH请求方式,更新标识为1的用户部分信息
http://xxx.com/api/users; // POST请求方式 添加新的用户
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# HTTP 请求规范
- GET(SELECT): 查询;从服务器取出资源
- POST(CREATE): 新增; 在服务器上新建一个资源
- PUT(UPDATE): 更新; 在服务器上更新资源(客户端提供改变后的完整资源)
- PATCH(UPDATE): 更新;在服务器上更新部分资源(客户端提供改变的属性)
- DELETE(DELETE): 删除; 从服务器上删除资源
# 参数命名规范
推荐采用下划线方式:
http://xxx.com/api/today_login // 获取今天登录的用户。
http://xxx.com/api/today_login&sort=login_desc // 获取今天登录的用户、登录时间降序排序。
1
2
2
# HTTP 状态码相关
# 状态码范围
- 1xx: 信息,请求收到了,继续处理
- 2xx: 代表成功. 行为被成功地接收、理解及采纳
- 3xx: 重定向
- 4xx: 客户端错误,请求包含语法错误或请求无法实现
- 5xx: 服务器端错误
具体的状态码及解释可参考 HTTP 协议中的状态码
# 返回统一数据格式
包含的字段:
- code:HTTP 响应状态码
- status:比如 success(code 在 200-299 之间) 、fail(code 在 500-599 之间)、error(code 在400-499 之间)
- data:请求成功时返回的数据信息,当 status 为 fail 或 error 时,包含错误原因或异常信息
(完)