一、核心概念:API 和 REST 分别是什么?
-
API (Application Programming Interface - 应用程序编程接口)
- 简单比喻: 就像餐厅的服务员。你(客户端)想点餐(请求数据或操作),你不需要直接冲进厨房(服务器)告诉厨师怎么做。你只需要告诉服务员(API)你想要什么(例如,“一份意大利面”),服务员会理解你的请求,告诉厨房,然后把做好的意大利面(响应数据)端给你。
- 技术定义: API 是一组预定义的规则和协议,规定了不同的软件组件之间如何相互通信和交互。
-
REST (Representational State Transfer - 表述性状态转移)
- 它是什么: REST 不是一种协议或标准,而是一种架构风格,是一组设计 Web API 的约束和原则。由 Roy Fielding 在他的博士论文中提出。
- 核心思想: 围绕“资源”来设计 API,并使用统一的接口(如 HTTP 方法)来操作这些资源。
一个遵循了 REST 架构风格的 API,就被称为 RESTful API。
二、REST 的核心原则(约束条件)
要成为一个真正的 RESTful API,必须满足以下六个约束:
-
客户端-服务器分离 (Client-Server)
- 关注点分离。客户端负责用户界面和用户体验,服务器负责数据处理和存储。两者可以独立进化。
-
无状态 (Stateless)
- 极其重要! 每一个从客户端发往服务器的请求都必须包含理解该请求所需的全部信息。服务器不会存储任何客户端会话状态。会话状态完全由客户端负责维护(例如通过 Cookie 或 Token)。
- 好处: 提高了可扩展性、可靠性和简单性。
-
可缓存 (Cacheable)
- 响应必须明确表明自己是否可缓存,以及可以缓存多久。这可以减少客户端-服务器之间的交互,提高性能。
-
统一接口 (Uniform Interface)
- 这是 REST 系统的核心特征,它又包含几个子原则:
- 资源的标识: 每个资源(如用户、文章)都有一个唯一的标识符,即 URI (Uniform Resource Identifier),例如
/users/123。 - 通过表述操作资源: 客户端通过操作资源的表述(如 JSON、XML)来操作资源本身,而不是直接操作资源。
- 自描述消息: 每个消息(请求或响应)都包含足够的信息来说明如何处理自己。
- 超媒体作为应用状态引擎 (HATEOAS): 理想的 REST API 的响应中应包含链接,指引客户端接下来可以执行哪些操作。例如,获取用户信息的响应里可能包含一个指向“删除该用户”操作的链接。
- 资源的标识: 每个资源(如用户、文章)都有一个唯一的标识符,即 URI (Uniform Resource Identifier),例如
- 这是 REST 系统的核心特征,它又包含几个子原则:
-
分层系统 (Layered System)
- 客户端不知道它是直接连接到最终服务器,还是连接到一个中间层(如负载均衡器、代理、网关)。这提高了系统的可扩展性和安全性。
-
按需代码(可选)(Code on Demand)
- 服务器可以临时扩展客户端的功能,例如返回可执行的代码(如 JavaScript)。这个约束是可选的,在实际 API 中很少见。
三、RESTful API 在实践中是如何工作的?(基于 HTTP)
虽然 REST 不强制要求使用 HTTP,但 HTTP 协议完美地实现了 REST 的原则,因此它们几乎总是成对出现。
| REST 概念 | HTTP 实现示例 |
|---|---|
| 资源 (Resource) | 任何事物(用户、订单、产品) |
| 资源的标识符 | URI (Uniform Resource Identifier),例如:GET /usersGET /users/101POST /orders |
| 操作 (动词) | HTTP 方法:GET(检索)POST(创建)PUT(全量更新)PATCH(部分更新)DELETE(删除) |
| 表述 (Representation) | 数据格式,通常在请求头 Accept 和响应头 Content-Type 中指定:application/json (最常用)application/xmltext/html |
一个经典的 CRUD 示例(对 articles 资源操作):
| 操作 | HTTP 方法 | Endpoint (URI) | 描述 | 成功状态码 |
|---|---|---|---|---|
| Create | POST | /articles | 创建一篇新文章 | 201 (Created) |
| Read | GET | /articles | 获取所有文章列表 | 200 (OK) |
| Read | GET | /articles/5 | 获取 ID 为 5 的文章 | 200 (OK) |
| Update | PUT | /articles/5 | 全量更新 ID 为 5 的文章 | 200 (OK) |
| Update | PATCH | /articles/5 | 部分更新 ID 为 5 的文章 | 200 (OK) |
| Delete | DELETE | /articles/5 | 删除 ID 为 5 的文章 | 204 (No Content) |
请求与响应示例:
- 请求
GET /users/101GET /users/101 HTTP/1.1 Host: api.example.com Authorization: Bearer <token> - 响应
HTTP/1.1 200 OK Content-Type: application/json { "id": 101, "name": "张三", "email": "zhangsan@example.com", "_links": { "self": { "href": "/users/101" }, "delete": { "href": "/users/101" } // 这就是 HATEOAS 的一个例子 } }
四、主要优点
- 简单和标准: 基于 HTTP,利用现有的标准和方法,学习和使用成本低。
- 可扩展性: 无状态和分层系统的约束使得它可以轻松通过增加服务器来扩展。
- 松耦合: 客户端和服务器独立发展,只要接口不变,就不会互相影响。
- 灵活性: 支持多种数据格式(JSON, XML 等),可以服务于不同类型的客户端(浏览器、手机App、IoT设备)。
五、常见误区与注意事项
-
URI 应该使用名词,而不是动词。
- 好:
GET /users(获取用户) - 不好:
GET /getUsers(URI 中不应包含动词,动词是 HTTP 方法的事情)
- 好:
-
使用正确的 HTTP 状态码。
200 OK- 成功201 Created- 创建成功400 Bad Request- 客户端请求错误401 Unauthorized- 未认证403 Forbidden- 无权限404 Not Found- 资源不存在500 Internal Server Error- 服务器内部错误
-
版本控制。 API 应该有自己的版本,以便未来进行不兼容的更新。常见做法是将版本号放入 URI (
/api/v1/users) 或 HTTP 头信息中。 -
过滤、排序、分页。 对于返回列表的接口(如
GET /articles),应该提供参数来实现这些功能,避免一次性返回海量数据。GET /articles?page=2&limit=20&sort=title&author=john
总结
REST API 是一种基于 HTTP 协议、遵循 REST 架构风格来设计 Web 服务的接口。它通过 URI 定位资源,通过 HTTP 方法定义操作,使用 JSON/XML 等格式传输数据,是一种简单、灵活、可扩展且广泛应用的 API 设计风格。
REST API 设计原理与实践
1069

被折叠的 条评论
为什么被折叠?



