REST
- REST是REpresentationsal State Transfer的缩写,具象状态转换
- RESTful是一种开发理念,是一种API设计风格,而不是标准
主要的规范
- 每一个URL代表一种资源,具体要对资源进行什么操作,是根据请求方式来区分的,而不是在URL上直接体现:
GET http://www.xxx.com/get_user/01
(不安全、繁琐、难维护等弊端),可以设计成GET http://www.xxx.com/user/01
- 后端返回的资源数据类型有:
- json格式数据
- text文本
- 图片、视频等
- 客户端和服务器之间,传递这种资源的某种表现形式
- 后端通过请求头
Content-Type
来指明传给服务端的参数类型,比如application/json
- 后端通过请求头中
Accept
来指明希望后端返回的相应数据的类型,比如application/json
- 后端通过请求头
- 客户端通过请求方式的不同,指明对服务器资源进行不同的操作
- GET:read
- POST:create
- PUT:update/replace
- PATCH:partial/update/modify
- DELETE:delete
REST常用的设计规范
一、URL
1. 命名
- 尽量使用名词复数形式,尽量不要使用动词
- 往往与数据库的表名对应
差的设计:
好的设计:
2. 过滤条件
如果记录数量很多,则需添加条件进行限制,否则返回数据太多,影响性能
?limit = 10 # 指定返回记录的数量
?offset = 10 # 指定返回记录的开始位置
?currPage=2&pageSize=10 # 指定第几页和每页多少条数据
?sort=name # 指定返回结果按照指定的属性进行排序
3.域名
- 尽量使用专用域名
http://api.wwj.com
4.版本号
- 在url中呈现版本号
http://xxx/app/1.0/
http://xxx/app/1.1/
- 也可以在请求头呈现
Accept:application/vnd.example.v1.0+json
Accept:application/vnd.example.v1.1+json;version=1.1
二、请求方式/动词
- 常见的http请求(括号中对应的sql命令)
GET(select)
: 从服务器获取资源(一个或多个)
POST(create)
: 在服务器创建一个资源
PUT(update)
: 在服务器更新资源(客户端提供所要更新的完整资源,比如要更新user的age,但如果是put,需要提供user的全部数据)
DELETE(delete)
: 从服务器删除资源 - 下面是不常见的三种
PATCH(update where):在服务器进行部分资源的更新(客户端提供改变的属性)
HEAD:获取资源的元数据
OPTIONS:获取关于资源的哪些属性是客户端可以改变的信息,一般 后面会跟其它常用请求
例子(很重要)
GET /projects # 获取所有项目信息
POST /projects # 创建一个新项目
GET / projects/6 # 获取id=6的项目信息
PUT /projects/6 # 更新id=6的项目信息(全更新)
PATCH /projects/6 # 更新id=6的项目信息(部分更新)
DELETE /projects/6 # 删除id=6的项目
''' 多层级信息的获取的设计 '''
GET /projects/6/interfaces # 获取id=6的项目信息中所有的接口信息
GET /projects/6/interfaces/1 #获取id=6的项目信息中id=1的接口信息
三、常见状态码(RESTful)
Status Codes
200 ok - [GET]: 服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH]: 用户创建成功或修改数据成功
204 NO CONTENT - [DELETE]: 用户删除数据成功
400 INVALID REQUEST - [POST/PUT/PATCH]:用户请求有误(请求参数有问题)
401 Unauthorized = [^] : 表示用户没有权限(cookies、用户名、密码错误)
403 Forbidden - [^]: 表示用户得到授权(和401错误相对),但是访问是禁止的
404 NOT FOUND - [^]: 表示用户请求的路径不存在
500 INTERNAL SERVER ERROR - [^]: 服务器发生错误
四、错误处理
当请求有误时,服务器需将错误信息以json的格式返回,比如:
{
"code":1001,
"data":null,
"msg":"用户不存在"
}
五、超链接API
响应数据中,可以包含下一步操作的url链接(比如说上一页、下一页的链接字段)