REST (Representational State Transfer) 并不是一个标准(Standard),而是一种软件架构风格(Architectural Style)。它由 Roy Fielding 在 2000 年的博士论文中提出,旨在利用 HTTP 协议原本的设计优势,让 Web 服务更易于扩展、缓存和维护。
以下我从 架构原则、实际设计规范、高级特性 三个维度系统拆解:
RESTful 之所以被称为“风格”,是因为它必须满足以下关键约束。如果违反了,严格意义上就不是 RESTful。
Cache-Control, ETag)减少客户端对服务器的重复请求,提高性能。在实际写代码时,RESTful 主要体现在以下四个方面的标准化:
REST 关注的是“事物”。
POST /deleteUser (动词,错误)GET /getBooks (动词,错误)DELETE /users/1GET /booksGET /users/1/orders (获取 1 号用户的所有订单)HTTP 方法不仅代表操作,还包含幂等性 (Idempotency) 和 安全性 (Safety) 的含义。
| HTTP 方法 | 对应操作 | 安全性 | 幂等性 | 说明 |
|---|---|---|---|---|
| GET | 读取 | 是 | 是 | 只读数据,多次请求结果一致,不改变服务器状态。 |
| POST | 新增 | 否 | 否 | 每次提交都会创建新资源(如连续点两下提交,生成两笔订单)。 |
| PUT | 全量替换 | 否 | 是 | 指定 ID 更新。如果 ID=1 的数据被更新成 A,重复更新 10 次它还是 A。 |
| PATCH | 局部更新 | 否 | 否/是 | 只改某个字段。通常设计为幂等。 |
| DELETE | 删除 | 否 | 是 | 删除 ID=1 的数据,删一次和删十次,结果都是“数据不存在了”。 |
不要永远只返回 200 OK 并在 Body 里写 code: error。RESTful 提倡使用 HTTP 状态码表达结果。
200 OK: 通用成功。201 Created: 资源创建成功(配合 Location 头返回新资源地址)。204 No Content: 成功,但不需要返回 Body(如 DELETE 操作)。400 Bad Request: 参数格式不对。401 Unauthorized: 没登录(未提供 Token)。403 Forbidden: 登录了,但没权限(比如普通用户删管理员)。404 Not Found: 资源不存在。500 Internal Server Error: 代码崩了。Accept 头告诉服务器:我想要 JSON 还是 XML。Content-Type 告诉客户端:我给你的是 JSON。这是 RESTful 的成熟度模型的最高级(Level 3),虽然实际开发中经常被简化,但它是 REST 的精髓之一。
HATEOAS (Hypermedia as the Engine of Application State)
含义: 响应中不仅包含数据,还包含下一步可以做什么的操作链接。
示例(查询银行账户):
{
"account_id": 12345,
"balance": 100.00,
"links": [
{ "rel": "self", "href": "/accounts/12345", "method": "GET" },
{ "rel": "deposit", "href": "/accounts/12345/deposit", "method": "POST" },
{ "rel": "withdraw", "href": "/accounts/12345/withdraw", "method": "POST" }
]
}
links 动态发现可以进行的操作。前端逻辑与后端 URL 解耦。优点:
缺点: