定义
REST (Representational State Transfer),中文意思是:表述性状态转移。即一组架构约束条件和原则,如果一个架构符合 REST 的约束条件和原则,我们就称它为 RESTful 架构。
- 在 REST 中,一切的内容都被认为是一种资源
- 每个资源都由 URI 唯一标识
- 使用统一的接口处理资源请求(POST/GET/PUT/DELETE/HEAD)
- 无状态(每次请求之前是无关联,没有 session )
REST 可以理解为 Client 和 Server 之间的一种交互方式,即 Client 发出 HTTP 请求,Server 端的资源发生状态转移,例如更新、删除等。而 RESTful API 则可以理解为 Server 端提供具有 REST 风格的接口。
符合 REST 规范的服务不应该保存客户端状态也不会保存应用的状态。
资源和 URI
- 使用
/
来表示资源的层级关系 - 使用
?
用来过滤资源 - 使用
_
或者-
让 URI 的可读性更好 ,
或;
可以用来表示同级资源的关系
统一资源接口
请求方法 | 描述 |
---|---|
GET | 获取某个资源。幂等(取多少次结果都没有变化) |
POST | 创建一个新的资源 |
PUT | 替换某个已有的资源(更新操作) ,幂等(更新多次只保存一个结果) |
DELETE | 删除某个资源 |
HEAD | 主要用于确认 URL 的有效性以及资源更新的日期时间等 |
PATCH | 新引入的,对 PUT 方法的补充,用来对已知资源进行局部更新 |
资源表述
客户端通过 HTTP 方法可以获取资源,确切的来说,客户端获取的只是资源的表述而已,传输的不是资源本身。资源的表述包括数据和描述数据的元数据,例如,HTTP 头 “Content-Type” 就是这样一个元数据属性。客户端可以通过 Accept
头请求一种特定格式的表述,服务端则通过 Content-Type
告诉客户端资源的表述形式。
实践
- 将 API 部署在专用域名之下;
- 将 API 的版本号放入 URL;
- 在 RESTful 架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的 ”集合”(collection),所以 API 中的名词也应该使用复数。
- 如果记录数量很多,服务器不可能都将它们返回给用户。API 应该提供参数,过滤返回结果
- 服务器向用户返回的状态码和提示信息
http://api.douban.com/v2/book/:id (获取图书信息)
http://api.douban.com/v2/movie/subject/:id (电影条目信息)
http://api.douban.com/v2/music/:id (获取音乐信息)
http://api.douban.com/v2/event/:id (获取同城活动)