REST架构的6大约束与API
🎯 详细解答:REST架构的6大约束与API
1️⃣ Client-Server Architecture(客户端-服务器架构)
核心概念: 关注点分离
- 客户端:负责用户界面和用户体验(如网页、手机App)
- 服务器:负责数据存储和业务逻辑处理
实际例子:
你用手机点外卖 App(客户端)↓ 发送请求
外卖平台服务器处理订单↓ 返回数据
App显示订单状态
好处:
- 客户端和服务器可以独立开发和更新
- 服务器可以同时服务多个不同的客户端(网页版、iOS、Android)
2️⃣ Statelessness(无状态性)
核心概念: 每个请求都是独立的
服务器不保存客户端的状态信息,每次请求必须包含所有必要信息。
实际例子:
❌ 有状态(不符合REST):
第1次请求:登录 → 服务器记住你
第2次请求:查询订单 → 服务器知道是你✅ 无状态(符合REST):
每次请求都带上身份令牌(Token)
请求:GET /orders + Token:abc123
服务器根据Token识别用户
好处:
- 服务器更简单,不需要记住每个用户
- 容易扩展(可以随意增加服务器)
- 更可靠(服务器崩溃不会丢失状态)
3️⃣ Layered System(分层系统)
核心概念: 中间可以有多层代理
客户端不需要知道是否直接连接到最终服务器。
实际例子:
用户 → CDN(内容分发) → 负载均衡器 → API网关 → 应用服务器 → 数据库
每一层只知道相邻层的存在,就像:
- 你点外卖不需要知道餐厅的厨房结构
- 你只需要和配送员交互
好处:
- 可以添加安全层、缓存层
- 提高系统灵活性和可扩展性
4️⃣ Cacheability(可缓存性)
核心概念: 响应数据应该标明是否可以缓存
实际例子:
第1次请求:GET /weather/beijing
服务器返回:
{"temp": "25°C","Cache-Control": "max-age=3600" ← 可缓存1小时
}第2次请求(1小时内):
直接使用缓存,不再请求服务器
常见缓存场景:
- ✅ 可缓存:天气数据、商品列表、新闻文章
- ❌ 不可缓存:银行余额、实时股票价格
好处:
- 减少服务器负担
- 提高响应速度
- 降低网络带宽消耗
5️⃣ Uniform Interface(统一接口)
核心概念: 所有API遵循统一的设计规范
四个约束:
a) 资源识别(通过URI)
GET /users/123 ← 获取ID为123的用户
GET /products/456 ← 获取ID为456的商品
b) 通过表述操作资源(HTTP方法)
GET /users/123 ← 查询
POST /users ← 创建
PUT /users/123 ← 更新
DELETE /users/123 ← 删除
c) 自描述消息
{"id": 123,"name": "张三","email": "zhangsan@example.com"
}
d) 超媒体作为应用状态引擎(HATEOAS)
{"id": 123,"name": "张三","links": [{"rel": "self", "href": "/users/123"},{"rel": "orders", "href": "/users/123/orders"}]
}
6️⃣ Code on Demand(按需代码) ⚠️ 可选
核心概念: 服务器可以向客户端发送可执行代码
实际例子:
- 服务器返回JavaScript代码,浏览器执行
- 网页中的脚本、Java Applet
<!-- 服务器返回的HTML包含脚本 -->
<script>function validateForm() {// 客户端验证逻辑}
</script>
注意: 这是REST中唯一可选的约束,因为:
- 可能有安全风险
- 不是所有客户端都能执行代码
🔗 综合实例:一个REST API的完整请求
GET /api/users/123 HTTP/1.1
Host: example.com
Authorization: Bearer abc123token
Accept: application/json
符合的约束:
- ✅ Client-Server:客户端请求,服务器响应
- ✅ Stateless:包含完整的认证信息(Token)
- ✅ Layered:可能经过CDN、负载均衡器
- ✅ Cacheable:响应头可以指定缓存策略
- ✅ Uniform Interface:使用标准HTTP方法和URI
- ⚪ Code on Demand:可选,通常不使用
💡 学习建议
- 实践为主:尝试调用真实的API(如天气API、GitHub API)
- 使用工具:Postman、curl 来测试API
- 阅读文档:看看知名公司的API文档(Twitter、Stripe)
- 动手开发:用Flask/Express创建简单的REST API