REST是什么?
是个万维网软件架构风格
用来创建网络服务
为什么叫 REST?
Representational State Transfer
Representational: 数据的表现形式(JSON, XML等等…)
State: 当前状态或者数据
Transfer: 数据传输
REST 的 6 个限制
- 客户-服务器(CS 架构 Client-Server)
关注点分离
服务端专注数据存储, 提升了简单性
前端专注用户界面, 提升了可移植性
简单性: 让服务端代码更简单了. 以前服务端还要渲染页面, 还要存储, 现在只管写好数据存储的逻辑
可移植性: 一个软件可以方便的移植到其他平台. 过去的前端是在操作系统里写的软件, 前端还要管数据存储等逻辑, 现在的前端是浏览器的前端, 只需要调接口去渲染界面
- 无状态(Stateless)
所有用户会话信息都保存在客户端
每次请求必须包括所有信息, 不能依赖上下文信息
无状态的好处: 服务端不用保存会话,提升了简单性,可靠性,可见性
- 缓存 (Cache)
所有服务端响应都要被标为可缓存或不可缓存
- 统一接口(Uniform Interface)
接口设计尽可能统一, 提升了简单性, 可见性
接口与实现解耦, 使前后端可以独立开发迭代
- 分层系统(Layered system)
每层只知道相邻的一层, 后面隐藏的就不知道了
客户端不知道是和代理还是真实服务器通信
其它层: 安全层, 负载均衡, 缓存层等
- 按需代码(Code-On-Demand 可选的)
客户端可以下载运行服务端传来的代码(比如 js)
通过减少一些功能, 简化了客户端
详解第四个限制统一接口的限制
资源的标识
资源是任何可以命名的事物: 比如用户, 评论等
每个资源可以通过 URI 被唯一标识, 比如
https://api.github.com/users 这是用户的接口
通过表述来操作资源
表述就是 Representation, 比如 JSON, XML 等
客户端不能直接操作(比如 SQL)服务端资源
客户端应该通过表述(比如 JSON)来操作资源
比如 github 的接口样式
自描述信息
每个消息(请求或响应) 必须提供足够的信息让接受者理解
具体的消息是什么? 比如:媒体类型(application/json, application/xml) 这个可以让接受者知道如何解析
HTTP 方法: get, post, delete
是否缓存: cache-control
超媒体作为应用状态引擎
超媒体: 带文字的链接
应用状态: 一个网页
引擎: 驱动, 跳转
合起来: 点击链接跳转到一个网页