概念
本质:一种软件架构风格,通过 REST 可以实现系统的高性能、可伸缩、通用性、简单性、可修改性和可扩展等特性。
核心:面向资源设计的API
解决问题:
- 降低开发的复杂性
- 提高系统的可伸缩性
例如:设计一套API,为多个终端服务。
设计概念和准则
- 网络上的所有事物都可以被抽象为资源
- 每一个资源都有唯一的资源标识,对资源的操作不会改变这些标识
- 所有的操作都是无状态的(本次操作、下次操作、上次操作之间无关系)
资源:网络上的一个实体、具体信息。
设计RESTful API
资源路径(URI):RESTful的核心是面向资源,如何规划资源路径很重要
HTTP动词(请求方式):如get,post,delete,put
过滤信息:例如获取资源列表时有分页操作/查询操作,这时要合理分配过滤信息,过滤信息设置太多,有可能会违反RESTful API 关于URI方面的限定。
状态码:当客户端发送一个请求时,服务端应当响应什么状态码
错误处理:如当发现客户端传入的参数有问题时,该返回什么样的状态信息。
返回结果:如POST资源的时候,需要返回一个资源实例;GET资源列表时,需要返回一个资源数组;
资源路径
在RESTful架构中,每个网址代表一个资源,所以网址中不能有动词,只能有名词。一般而言,API中的名词应该使用复数。例如,使用users反映用户资源的URI,而不是使用user。
URL结尾不应该包含斜杠“/”,这是作为URL路径中处理中最重要的规则之一,正斜杠(/)不会增加语义值,且可能导致混淆。REST API不允许一个尾部的斜杠,不应该将它们包含在提供给客户端的链接的结尾处。rul的路径中的正斜杠“/“字符用于指示资源之间的层次关系。
例如:有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,那么它的资源路径应设计成如下样子。
https://api.example.com/v1/zoos //动物园资源。使用https协议头;加入v1版本号,因为以后可能会更改api。版本号的加入有两种做法,一种是加入到地址中,另一种是加入到HTTP请求头中;zoos复数
https://api.example.com/v1/animals //动物资源
https://api.example.com/v1/employees //雇员资源
HTTP动词
对资源的操作有创建、读取、更新、删除(CURD),由HTTP动词表示。
GET : 从服务器去获取资源
POST :在服务器新建一个资源
PUT:在服务器更新资源(客户端提供改变后的完整资源,服务端返回完整的更新字段)
PATCH:在服务器更新资源(客户端提供改变的属性,服务端返回只发生了更新的字段)
DELETE:从服务器删除资源
例如:
POST/zoos : 新建一个动物园
GET/zoos/ID : 获取某个指定动物园的信息
PUT/zoos/ID : 更新某个指定动物园的信息
DELETE/zoos/ID : 删除某个动物园
过滤信息
如果记录数量过多,服务器不可能都将它们返回给用户。这时就需要进行筛选。筛选时,API应该提供一个参数,过滤一下返回的结果。
例如:
?offset = 10 :指定返回记录的开始位置
?page = 2&per_page = 100 :指定第几页,以及每页的记录数
?sortby = name&order = asc :指定返回结果排序,以及排序顺序
?animal_type_id = 1 :指定筛选条件
状态码
服务器向用户返回的状态码和提示信息,使用标准的HTTP状态码
200 OK 服务器成功返回用户请求的数据
201 CREATED 新建或修改数据成功
204 NO CONTENT 删除数据成功
400 BAD REQUEST 用户发出的请求有错误
401 Unauthorized 表示用户没有认证,无法进行当前操作
403 Forbidden 表示用户的访问是被禁止的
422 Unprocesable Entity 当创建一个对象时,发生一个验证错误。例如创建用户资源时需要用户名、密码,而前端只提供用户名字段,那么就要返回一个422 状态码,并返回错误信息:”密码不能为空“
500 INTERNAL SERVER ERROR 服务器内部错误,此时服务端无法处理任何请求。
错误处理
如果状态码是4xx或5xx,就应该向用户返回出错信息。一般而言,返回的信息中将error作为键名,出错信息作为键值即可,例如:
{
"error":"参数错误"
}
返回结果
针对不同操作(如GET,POST),服务器向用户返回的结果应该符合以下规范:
GET/collections: 返回资源对象的列表(数组)
GET/collections/identity : 读取资源时,传入标识符(identity),服务端返回标识符指定的单个资源对象
POST/collections : 返回新生成的资源对象
PUT/collections/identity : 返回完整的资源对象
PATCH/collections/identity : 返回被修改的属性
DELETE/collections/identity : 返回一个204状态码和空响应体
综述
综合上面的解释,我们总结一下什么是RESTful架构:
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。