Skip to content

什么是 RESTful API

本章导读:在动手学习规范细节之前,我们先建立一个清晰的整体认知——RESTful API 到底是什么、它解决什么问题、长什么样子。本章以一个最小可运行的例子贯穿始终,让你先"看见"REST,再去理解它背后的设计思想。

1. 从一次真实的接口调用说起

假设你要开发一个博客系统,前端需要"获取 id 为 42 的文章"。在 RESTful 风格出现之前,很多团队的接口长这样:

POST /api/articleService
Body: { "method": "getArticleById", "id": 42 }

这是一个典型的 RPC(远程过程调用)风格:URL 描述的是"要执行的动作",所有信息都塞进请求体,HTTP 只是隧道的壳。

而同样的需求,RESTful 风格的写法是:

GET /api/articles/42 HTTP/1.1
Host: book.example.com
Accept: application/json

响应:

http
HTTP/1.1 200 OK
Content-Type: application/json

{
  "id": 42,
  "title": "RESTful API 设计规范",
  "author": "麻瓜",
  "status": "published",
  "createdAt": "2026-01-15T08:30:00Z"
}

两种风格的核心差异一目了然:

对比项RPC 风格RESTful 风格
URL 含义动词/服务名(getArticleById名词/资源(/articles/42
动作表达藏在请求体里由 HTTP 方法(GET/PUT/DELETE)表达
操作结果业务字段自解释(各团队各写各的)标准 HTTP 状态码(200/404/409…)
HTTP 协议利用程度只当传输通道充分利用语义(方法、状态码、缓存、内容协商)

RESTful API 的本质:把 HTTP 协议本身的设计(URI、方法、状态码、头部)用足、用对,让接口"不言自明"。

2. REST 的定义

REST(REpresentational State Transfer,表现层状态转化)这一概念由 Roy Fielding 在其 2000 年的博士论文《Architectural Styles and the Design of Network-based Software Architectures》中提出。Fielding 是 HTTP 规范的主要作者之一,REST 正是从 HTTP 协议的设计初衷中提炼出来的架构风格。

用一句话概括:

REST 是一种架构风格(architectural style),它通过一组约束条件(constraints),指导你设计出以资源为核心、无状态、统一接口的分布式系统。

注意三个关键词:

  1. 架构风格,不是协议、不是标准、不是框架。REST 只说"应该遵循这些原则",具体怎么落地(URL 怎么写、JSON 字段叫什么名)需要团队自己制定规范——这正是本教程要讲的内容。
  2. **资源(Resource)**是核心。每个 URI 标识一个资源,客户端通过操作资源的"表现(Representation)"来与服务器交互。
  3. 表现层状态转化:服务器保存资源的状态(数据),客户端每次请求都携带足够信息(如 Token),服务器读取/改写资源后返回新的表现(如 JSON),完成一次"状态转化"。

3. 一个 RESTful API 的解剖

我们放大看一个完整的"删除文章"请求,标注出 REST 的各个要素:

DELETE /api/v1/articles/42 HTTP/1.1        ← 方法 + URI:对哪个资源做什么操作
Host: api.book.example.com
Authorization: Bearer eyJhbGciOiJIUzI1...   ← 凭证:无状态设计,不依赖服务器会话
Accept: application/json                    ← 内容协商:希望服务器返回什么格式
If-Match: "9a3f-bb12-..."                   ← 条件请求:乐观并发控制

响应:

http
HTTP/1.1 204 No Content                     ← 状态码:操作结果的标准表达
                                       ← 204 表示成功且无响应体,这是 RFC 9110 的规定

一次交互中体现了 REST 的四大接口要素(后续章节逐一展开):

要素本例中的体现规范依据
资源标识/api/v1/articles/42RFC 3986 (URI Generic Syntax)
资源操作DELETE 方法RFC 9110 (HTTP Semantics)
资源表现Accept: application/json 协商RFC 9110 + RFC 8259 (JSON)
交互结果204 No Content 状态码RFC 9110 状态码注册表

4. "RESTful" 与 "REST" 的区别

日常交流中两个词经常混用,但严格来说:

  • REST:Fielding 论文中定义的那套完整架构约束(含 HATEOAS,见后文)。
  • RESTful:工程实践中对"遵循了资源建模 + HTTP 方法 + 状态码这套设计方式的 API"的通俗称呼。

绝大多数商业 API(GitHub、Stripe、腾讯云等)其实是 "RESTful" 而非教科书意义上的完整 REST——它们通常不实现 HATEOAS。本教程以工程视角为主:既讲清楚 Fielding 的原始约束,也给出业界公认的设计规范,帮你写出符合 RFC 语义、团队可维护、机器可理解的 API。

5. 什么样的 API 不算 RESTful

以下反例在真实项目中非常常见,先建立"嗅觉":

❌ POST /api/getArticleList              ← 动词出现在 URI 中
❌ GET  /api/deleteArticle?id=42         ← 用 GET 做删除,破坏方法语义
❌ GET  /api/article/42,43,44            ← 资源标识混乱
✅ GET  /api/articles?author=42         ← 正确:查询参数表达过滤
✅ DELETE /api/articles/42              ← 正确:方法表达动作

❌ 永远返回 200,靠 body 里的 code 区分成败
{ "code": -1, "msg": "not found" }
✅ 返回 404 + 标准错误体(见"错误处理规范"一章)

IMPORTANT

Fielding 本人曾在 2009 年的博文《REST APIs must be hypertext-driven》中针对"只用了 URL 和 JSON 就自称 REST"的实践发出著名吐槽:"如果 API 使用了 POST 和 GET,URI,并且用 JSON 或 XML 作为媒体类型,那它就完全不是 RESTful。"(原文见 roy.gbiv.com)真正的 REST 要求统一接口超媒体驱动。不必教条照搬,但这提醒我们:REST 的灵魂是"用协议说话",而不是贴标签。

6. 为什么要严格遵守规范

你可能会问:接口能跑就行了,为什么要在意 RFC?

  1. 互操作性:状态码 401403 语义不同,网关、SDK、监控系统可以自动处理(如 401 触发重新登录,403 提示无权限)。
  2. 缓存:正确使用 GET + Cache-Control + ETag,CDN 与浏览器可以免费帮你扛流量;乱用 POST 则永远无法缓存。
  3. 工具链:符合 OpenAPI 规范的接口能自动生成文档、客户端代码、Mock 服务、契约测试。
  4. 协作成本:新同事看到 DELETE /articles/42 → 204 无需读文档就明白行为;看到 POST /doArticle 则必须翻代码。
  5. 长期演进:遵循规范的系统(版本、弃用、条件请求)才能平滑升级而不破坏老客户端。

7. 本章小结

  • RESTful API = 以资源为中心,用 URI 标识资源、用 HTTP 方法操作资源、用状态码表达结果、用**表现层(JSON 等)**传递数据。
  • REST 出自 Fielding 博士论文,与 HTTP 同源;"RESTful" 是工程上的通俗叫法。
  • 判断 API 好坏的快速标准:把 body 遮住,只看方法 + URI + 状态码,能不能读懂 80% 的意图。

8. 下一步