REST API 简介 #
什么是 API? #
在了解 REST API 之前,我们需要先理解 API(Application Programming Interface,应用程序编程接口)的概念。API 是软件系统之间进行通信的桥梁。
text
┌─────────────────────────────────────────────────────────────┐
│ API 的本质 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 类比: │
│ │
│ ┌─────────┐ API 调用 ┌─────────┐ │
│ │ 应用A │ ───────────────> │ 应用B │ │
│ └─────────┘ └─────────┘ │
│ │
│ 就像: │
│ - 餐厅菜单:告诉你可以点什么菜 │
│ - 遥控器:告诉你如何控制电视 │
│ - 服务窗口:告诉你如何办理业务 │
│ │
└─────────────────────────────────────────────────────────────┘
API 的类型 #
text
┌─────────────────────────────────────────────────────────────┐
│ API 类型分类 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 库/框架 API │
│ - 编程语言内部调用 │
│ - 如:jQuery API、React API │
│ │
│ 2. 操作系统 API │
│ - 系统级功能调用 │
│ - 如:Windows API、POSIX API │
│ │
│ 3. Web API(本系列重点) │
│ - 网络服务接口 │
│ - 如:REST API、GraphQL API │
│ │
└─────────────────────────────────────────────────────────────┘
什么是 REST? #
REST(Representational State Transfer,表述性状态转移)是一种软件架构风格,由 Roy Fielding 在 2000 年的博士论文中提出。它定义了一组设计 Web 服务的约束条件和原则。
核心定位 #
text
┌─────────────────────────────────────────────────────────────┐
│ REST │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 资源导向 │ │ 无状态 │ │ 统一接口 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 分层系统 │ │ 可缓存 │ │ 按需代码 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
REST 解决的问题 #
text
┌─────────────────────────────────────────────────────────────┐
│ REST 解决的问题 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 传统 Web 服务问题: │
│ │
│ 1. SOAP 协议复杂 │
│ - XML 格式冗余 │
│ - 学习成本高 │
│ - 开发效率低 │
│ │
│ 2. 接口设计混乱 │
│ - 命名不规范 │
│ - 动词混用 │
│ - 难以理解和使用 │
│ │
│ 3. 耦合度高 │
│ - 客户端与服务端紧密耦合 │
│ - 难以扩展和维护 │
│ │
│ REST 解决方案: │
│ │
│ ✅ 简单:基于 HTTP 协议,易于理解和使用 │
│ ✅ 统一:标准化接口设计,降低学习成本 │
│ ✅ 解耦:客户端与服务端独立发展 │
│ ✅ 可扩展:支持分层架构,易于扩展 │
│ │
└─────────────────────────────────────────────────────────────┘
REST 的历史 #
发展历程 #
text
1994年 ─── HTTP/1.0 发布
│
│ Web 基础协议
│ 简单的请求响应
│
│
│ Roy Fielding 提出
│ HTTP 协议的设计原则
│ 架构风格定义
│
2002年 ─── REST 流行
│
│ Web 2.0 兴起
│ Ajax 技术普及
│ API 需求增长
│
2006年 ─── REST 框架涌现
│
│ Ruby on Rails
│ Django REST Framework
│ Spring MVC
│
2010年 ─── REST 成为主流
│
│ 移动互联网爆发
│ 微服务架构兴起
│ 云原生应用
│
至今 ─── 行业标准
│
│ 几乎所有 Web API
│ 微服务通信标准
│ 云服务接口规范
里程碑事件 #
| 时间 | 事件 | 意义 |
|---|---|---|
| 1994 | HTTP/1.0 | Web 协议基础 |
| 1999 | HTTP/1.1 | 完善 HTTP 方法 |
| 2000 | REST 论文 | 架构风格定义 |
| 2006 | AWS S3 API | REST 商业化成功 |
| 2010 | GitHub API | REST 最佳实践 |
| 2015 | HTTP/2 | 性能优化 |
REST 的六大约束 #
1. 统一接口(Uniform Interface) #
text
┌─────────────────────────────────────────────────────────────┐
│ 统一接口约束 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 核心原则: │
│ │
│ 1. 资源标识(Identification of Resources) │
│ - 使用 URI 标识资源 │
│ - /users/123 │
│ - /products/456 │
│ │
│ 2. 通过表述操作资源(Manipulation through Representations) │
│ - 使用 JSON/XML 表示资源 │
│ - 通过表述执行操作 │
│ │
│ 3. 自描述消息(Self-descriptive Messages) │
│ - 请求包含所有必要信息 │
│ - 响应包含状态说明 │
│ │
│ 4. 超媒体作为应用状态引擎(HATEOAS) │
│ - 响应包含相关链接 │
│ - 引导客户端进行下一步操作 │
│ │
└─────────────────────────────────────────────────────────────┘
2. 无状态(Stateless) #
text
┌─────────────────────────────────────────────────────────────┐
│ 无状态约束 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 定义: │
│ 每个请求必须包含服务端处理所需的所有信息 │
│ 服务端不保存客户端会话状态 │
│ │
│ 有状态 vs 无状态: │
│ │
│ 有状态: │
│ 请求1: 登录 ───> 服务端保存用户状态 │
│ 请求2: 获取数据 ───> 服务端查找用户状态 │
│ │
│ 无状态: │
│ 请求1: 登录 ───> 返回 Token │
│ 请求2: 获取数据 + Token ───> 服务端验证 Token │
│ │
│ 优势: │
│ ✅ 可扩展性:任何服务器都能处理请求 │
│ ✅ 可靠性:服务器崩溃不影响其他服务器 │
│ ✅ 可见性:请求包含所有信息,便于监控 │
│ │
└─────────────────────────────────────────────────────────────┘
3. 客户端-服务端分离(Client-Server) #
text
┌─────────────────────────────────────────────────────────────┐
│ 客户端-服务端分离 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 客户端 │ │ 服务端 │ │
│ ├─────────────────┤ ├─────────────────┤ │
│ │ - 用户界面 │ │ - 数据存储 │ │
│ │ - 用户交互 │◄────────────►│ - 业务逻辑 │ │
│ │ - 请求发送 │ HTTP │ - 请求处理 │ │
│ │ - 响应展示 │ │ - 响应生成 │ │
│ └─────────────────┘ └─────────────────┘ │
│ │
│ 关注点分离: │
│ - 客户端关注用户体验 │
│ - 服务端关注数据处理 │
│ - 两者独立发展、独立部署 │
│ │
└─────────────────────────────────────────────────────────────┘
4. 可缓存(Cacheable) #
text
┌─────────────────────────────────────────────────────────────┐
│ 可缓存约束 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 定义: │
│ 响应数据应该标明是否可缓存,以及缓存策略 │
│ │
│ 缓存控制示例: │
│ │
│ HTTP/1.1 200 OK │
│ Cache-Control: max-age=3600, public │
│ ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" │
│ Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT │
│ │
│ 优势: │
│ ✅ 减少网络延迟 │
│ ✅ 降低服务器负载 │
│ ✅ 提高响应速度 │
│ │
└─────────────────────────────────────────────────────────────┘
5. 分层系统(Layered System) #
text
┌─────────────────────────────────────────────────────────────┐
│ 分层系统约束 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ │
│ │ 客户端 │ │
│ └────┬────┘ │
│ │ │
│ ┌────▼────┐ ┌─────────┐ │
│ │ 负载均衡 │────►│ API网关 │ │
│ └─────────┘ └────┬────┘ │
│ │ │
│ ┌────────────────────┼────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │服务A│ │服务B│ │服务C│ │
│ └──┬──┘ └──┬──┘ └──┬──┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ DB1 │ │ DB2 │ │ DB3 │ │
│ └─────┘ └─────┘ └─────┘ │
│ │
│ 客户端不知道它连接的是终端服务器还是中间层 │
│ 每一层都可以独立扩展和管理 │
│ │
└─────────────────────────────────────────────────────────────┘
6. 按需代码(Code on Demand)- 可选 #
text
┌─────────────────────────────────────────────────────────────┐
│ 按需代码约束 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 定义: │
│ 服务端可以临时扩展客户端功能,通过传输可执行代码 │
│ │
│ 示例: │
│ - JavaScript 脚本 │
│ - Java Applet(已废弃) │
│ - Flash(已废弃) │
│ │
│ 现代应用: │
│ - 动态加载 JavaScript 模块 │
│ - Web Components │
│ - 服务端推送配置 │
│ │
│ 注意:这是唯一可选的约束 │
│ │
└─────────────────────────────────────────────────────────────┘
RESTful API 的核心概念 #
资源(Resource) #
text
┌─────────────────────────────────────────────────────────────┐
│ 资源概念 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 定义: │
│ 资源是 REST 架构的核心概念,表示任何可以被命名的事物 │
│ │
│ 资源示例: │
│ - 用户(User) │
│ - 订单(Order) │
│ - 商品(Product) │
│ - 评论(Comment) │
│ │
│ 资源标识: │
│ - 使用 URI(统一资源标识符)标识 │
│ - /users/123 │
│ - /orders/456 │
│ │
│ 资源表述: │
│ - JSON 格式(最常用) │
│ - XML 格式 │
│ - HTML 格式 │
│ │
└─────────────────────────────────────────────────────────────┘
表述(Representation) #
text
┌─────────────────────────────────────────────────────────────┐
│ 表述概念 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 定义: │
│ 资源在特定时刻的状态快照,以某种格式呈现 │
│ │
│ JSON 表述示例: │
│ { │
│ "id": 123, │
│ "name": "张三", │
│ "email": "zhangsan@example.com", │
│ "createdAt": "2025-01-15T10:30:00Z" │
│ } │
│ │
│ 同一资源可以有多种表述: │
│ - JSON(application/json) │
│ - XML(application/xml) │
│ - HTML(text/html) │
│ - 图片(image/png) │
│ │
└─────────────────────────────────────────────────────────────┘
状态转移(State Transfer) #
text
┌─────────────────────────────────────────────────────────────┐
│ 状态转移概念 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 定义: │
│ 客户端通过操作资源表述,实现应用状态的转移 │
│ │
│ 状态转移示例: │
│ │
│ 初始状态:用户未登录 │
│ ┌─────────┐ │
│ │ Guest │ │
│ └─────────┘ │
│ │ │
│ │ POST /auth/login │
│ │ { "username": "admin", "password": "xxx" } │
│ ▼ │
│ 转移后状态:用户已登录 │
│ ┌─────────┐ │
│ │ Admin │ │
│ └─────────┘ │
│ │
│ 这就是 REST(表述性状态转移)名称的由来 │
│ │
└─────────────────────────────────────────────────────────────┘
RESTful API vs 传统 API #
对比示例 #
text
┌─────────────────────────────────────────────────────────────┐
│ 传统 RPC 风格 API │
├─────────────────────────────────────────────────────────────┤
│ │
│ GET /getAllUsers │
│ GET /getUserById?id=123 │
│ POST /createUser │
│ POST /updateUser │
│ POST /deleteUser?id=123 │
│ │
│ 问题: │
│ ❌ URL 中包含动词,语义混乱 │
│ ❌ 使用 GET 执行删除操作 │
│ ❌ 接口命名不统一 │
│ ❌ 难以理解和维护 │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ RESTful API │
├─────────────────────────────────────────────────────────────┤
│ │
│ GET /users 获取用户列表 │
│ GET /users/123 获取指定用户 │
│ POST /users 创建用户 │
│ PUT /users/123 更新用户(完整) │
│ PATCH /users/123 更新用户(部分) │
│ DELETE /users/123 删除用户 │
│ │
│ 优势: │
│ ✅ URL 只包含名词,表示资源 │
│ ✅ HTTP 方法表示操作类型 │
│ ✅ 接口规范统一 │
│ ✅ 易于理解和维护 │
│ │
└─────────────────────────────────────────────────────────────┘
详细对比 #
| 特性 | 传统 API | RESTful API |
|---|---|---|
| URL 设计 | 动词+名词 | 纯名词 |
| 操作表达 | URL 中体现 | HTTP 方法 |
| 状态管理 | 有状态 | 无状态 |
| 可缓存性 | 较差 | 良好 |
| 可扩展性 | 一般 | 优秀 |
| 学习成本 | 各不相同 | 统一标准 |
RESTful API 的优势 #
1. 简单统一 #
text
✅ 基于 HTTP 协议
- 无需额外学习新协议
- 工具支持完善
- 调试方便
✅ 标准化接口
- 统一的 URL 设计
- 统一的 HTTP 方法使用
- 统一的状态码
2. 可扩展性 #
text
✅ 无状态设计
- 任何服务器都能处理请求
- 水平扩展简单
✅ 分层架构
- 可以添加负载均衡
- 可以添加缓存层
- 可以添加安全层
3. 松耦合 #
text
✅ 客户端与服务端独立
- 前后端分离开发
- 技术栈独立选择
- 独立部署和扩展
4. 可见性 #
text
✅ 请求自描述
- 包含所有必要信息
- 便于监控和调试
- 便于缓存和代理
RESTful API 的局限性 #
1. 多次请求问题 #
text
┌─────────────────────────────────────────────────────────────┐
│ 多次请求问题 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 场景:获取用户及其所有订单 │
│ │
│ RESTful 方式: │
│ 1. GET /users/123 获取用户信息 │
│ 2. GET /users/123/orders 获取用户订单 │
│ │
│ 问题: │
│ ⚠️ 需要多次请求 │
│ ⚠️ 网络开销大 │
│ │
│ 解决方案: │
│ - GraphQL(按需查询) │
│ - 嵌入资源(Embedding Resources) │
│ - 批量接口 │
│ │
└─────────────────────────────────────────────────────────────┘
2. 版本管理 #
text
┌─────────────────────────────────────────────────────────────┐
│ 版本管理问题 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 问题: │
│ API 变更如何保持向后兼容? │
│ │
│ 解决方案: │
│ - URL 版本:/v1/users, /v2/users │
│ - Header 版本:Accept: application/vnd.api.v1+json │
│ - 查询参数:/users?version=1 │
│ │
└─────────────────────────────────────────────────────────────┘
3. 实时数据 #
text
┌─────────────────────────────────────────────────────────────┐
│ 实时数据问题 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 问题: │
│ REST 基于请求-响应模式,不支持服务端主动推送 │
│ │
│ 解决方案: │
│ - WebSocket:双向实时通信 │
│ - Server-Sent Events:服务端推送 │
│ - 轮询:定时请求(效率低) │
│ │
└─────────────────────────────────────────────────────────────┘
RESTful API 的应用场景 #
1. Web 应用 #
text
┌─────────────────────────────────────────────────────────────┐
│ Web 应用 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 前后端分离架构: │
│ │
│ ┌─────────┐ REST API ┌─────────┐ │
│ │ 前端 │◄───────────────►│ 后端 │ │
│ │ React │ │ Node.js │ │
│ │ Vue │ │ Python │ │
│ │ Angular │ │ Java │ │
│ └─────────┘ └─────────┘ │
│ │
│ 优势: │
│ - 前后端独立开发 │
│ - 多端复用同一 API │
│ - 便于团队协作 │
│ │
└─────────────────────────────────────────────────────────────┘
2. 移动应用 #
text
┌─────────────────────────────────────────────────────────────┐
│ 移动应用 │
├─────────────────────────────────────────────────────────────┤
│ │
│ iOS / Android 应用后端: │
│ │
│ ┌─────────┐ │
│ │ iOS App │──┐ │
│ └─────────┘ │ │
│ │ REST API ┌─────────┐ │
│ ┌─────────┐ ├──────────────────►│ 后端 │ │
│ │Android │──┤ │ 服务 │ │
│ │ App │ │ └─────────┘ │
│ └─────────┘ │ │
│ │ │
│ ┌─────────┐ │ │
│ │ 小程序 │──┘ │
│ └─────────┘ │
│ │
│ 优势: │
│ - 一套 API 支持多端 │
│ - 无状态设计适合移动端 │
│ - 易于缓存优化 │
│ │
└─────────────────────────────────────────────────────────────┘
3. 微服务架构 #
text
┌─────────────────────────────────────────────────────────────┐
│ 微服务架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 服务间通信: │
│ │
│ ┌─────────┐ REST API ┌─────────┐ │
│ │ 用户服务 │◄───────────────►│ 订单服务 │ │
│ └─────────┘ └─────────┘ │
│ ▲ ▲ │
│ │ REST API │ │
│ │ │ │
│ ┌────┴────┐ ┌────┴────┐ │
│ │ 商品服务 │◄─────────────────│ 支付服务 │ │
│ └─────────┘ └─────────┘ │
│ │
│ 优势: │
│ - 服务解耦 │
│ - 技术栈独立 │
│ - 独立部署和扩展 │
│ │
└─────────────────────────────────────────────────────────────┘
4. 第三方集成 #
text
┌─────────────────────────────────────────────────────────────┐
│ 第三方集成 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 开放 API 平台: │
│ │
│ - 微信开放平台 API │
│ - 支付宝开放平台 API │
│ - GitHub API │
│ - Twitter API │
│ - Stripe API │
│ │
│ 优势: │
│ - 标准化接口易于集成 │
│ - 无状态设计易于授权 │
│ - 文档化便于开发者使用 │
│ │
└─────────────────────────────────────────────────────────────┘
学习路径 #
text
入门阶段
├── REST API 简介(本文)
├── RESTful 设计原则
└── 资源设计
进阶阶段
├── 端点设计
├── HTTP 方法使用
├── 状态码使用
└── API 版本管理
高级阶段
├── API 安全
├── 分页与过滤
├── 错误处理
└── 最佳实践
扩展阶段
├── 高级主题
├── GraphQL vs REST
└── 实战案例
下一步 #
现在你已经了解了 REST API 的基本概念,接下来学习 RESTful 设计原则,深入了解如何设计优秀的 RESTful API!
最后更新:2026-03-29