REST 的六大设计约束
-
客户端-服务器架构
- 分离职责:客户端与服务器完全解耦,各自独立演化。
- 优势:提升可扩展性,简化服务器端复杂度,允许客户端灵活更新。
-
无状态性
- 定义:服务器不保存客户端会话状态,每次请求必须包含完整上下文。
- 实现:通过请求参数、Cookie 或 Token 传递必要信息。
- 优势:提高可靠性、可伸缩性,避免单点故障。
-
缓存
- 要求:响应必须明确标注是否可缓存(如
Cache-Control
头)。 - 优势:减少网络流量,提升性能,优化用户体验。
- 要求:响应必须明确标注是否可缓存(如
-
统一接口
- 核心要素:
- 资源标识:每个资源通过唯一 URI(如
/products/123
)访问。 - 操作方式:使用标准 HTTP 方法(GET/POST/PUT/PATCH/DELETE)操作资源。
- 表示交换:通过 JSON/XML 等格式传输资源状态(Representational State Transfer)。
- 自描述消息:响应包含元数据(如 Content-Type),无需额外文档即可解析。
- HATEOAS:超文本驱动应用状态,响应中嵌入链接引导下一步操作(如
{"next": "/products?page=2"}
)。
- 资源标识:每个资源通过唯一 URI(如
- 核心要素:
-
分层系统
- 定义:支持中间层(如代理、缓存服务器),隐藏底层实现细节。
- 优势:增强可扩展性,简化部署,隔离客户端与服务器直接交互。
-
按需代码(可选)
- 功能:允许服务器动态下载代码到客户端(如 JavaScript 扩展功能)。
- 场景:适用于需要动态行为调整的场景(如 Web 应用热更新)。
REST 的本质目标
- 解耦系统组件:通过标准化接口降低依赖,支持独立开发与维护。
- 高效通信:利用 HTTP 协议特性(如缓存、状态码)优化性能。
- 可进化性:允许服务端迭代升级,只要保持接口兼容。
关键实践建议
- 资源设计:以名词命名资源(如
/orders
),而非动词(如/get-orders
)。 - 层级结构:通过 URL 层级体现资源关系(如
/managers/23/orders
)。 - HATEOAS 实现:在响应中提供导航链接,减少客户端硬编码路径依赖。