1. RESTful API 概述:什么是REST、RESTful API的六大约束、RESTful API的优势与适用场景
1.1 什么是REST?先从一个故事说起
我记得刚入行那会儿,团队里讨论接口设计,大家各说各的。有人用 /getUser?id=1,有人用 /user/query?type=1,还有人直接 POST 一个 JSON 过去让后端自己猜意图。那叫一个乱。
后来我接触到 REST,才明白原来接口设计是有「章法」的。
REST 的全称是 Representational State Transfer,中文叫「表现层状态转移」。名字听着玄乎,说白了就是:把后端资源抽象成 URL,用 HTTP 方法去操作它。
举个例子:
// 不 REST 的风格
POST /api/getUser
POST /api/deleteUser
POST /api/updateUser
// RESTful 风格
GET /api/users/1 // 获取用户
DELETE /api/users/1 // 删除用户
PUT /api/users/1 // 更新用户
你看,同样的资源 /api/users/1,用不同的 HTTP 方法表达不同的操作。这就是 REST 最核心的思想。
核心要点:REST 不是协议,不是框架,而是一种架构风格。它基于 HTTP 协议,但比 HTTP 更「讲究」。
1.2 RESTful API 的六大约束
REST 有六个约束条件。少一个,就不能叫严格的 RESTful API。我在项目中见过不少「自称 RESTful 但实际只满足两三条」的接口,嗯,这里要注意区分。
约束一:客户端-服务器(Client-Server)
这个好理解。前端只管展示,后端只管存数据。各司其职,互不干扰。我见过有人把业务逻辑写在 SQL 里,也有人把渲染逻辑塞进后端接口——都是坑。
约束二:无状态(Stateless)
每个请求必须包含所有必要信息。服务器不存客户端上下文。
避坑指南:我曾经在一个项目中把用户登录状态存在服务端 Session 里,结果做负载均衡时发现用户请求被路由到不同节点就掉线了。后来改成 JWT Token,每个请求自己带身份信息,问题才解决。
约束三:可缓存(Cacheable)
响应要明确标注是否可缓存。用 Cache-Control、ETag 这些头信息告诉客户端:「这个数据你可以存多久」。
约束四:统一接口(Uniform Interface)
这是最核心的约束。包含四点:
- 资源标识:每个资源有唯一 URL
- 通过表现操作资源:客户端拿到的是资源的「表现」,比如 JSON
- 自描述消息:每个请求/响应都包含足够信息让对方理解
- HATEOAS:响应里包含下一步可做的操作链接(这个很多项目做不到,但它是 REST 的终极形态)
约束五:分层系统(Layered System)
客户端不知道它直接连的是最终服务器还是中间代理。你可以加负载均衡、加缓存层、加网关,客户端完全无感知。
约束六:按需代码(Code on Demand,可选)
服务器可以给客户端返回可执行脚本(比如 JavaScript)。这个约束是可选的,实际用得少。
| 约束 | 是否必须 | 我的经验 |
|---|---|---|
| 客户端-服务器 | 必须 | 基本所有 Web 项目都满足 |
| 无状态 | 必须 | 最容易踩坑的地方 |
| 可缓存 | 必须 | 很多人忽略,但性能提升明显 |
| 统一接口 | 必须 | REST 的灵魂所在 |
| 分层系统 | 必须 | 微服务架构天然满足 |
| 按需代码 | 可选 | 我几乎没用过 |
1.3 RESTful API 的优势
你想想看,为什么 REST 能火这么多年?我个人觉得有这几个原因:
- 简单直观:URL 就是资源,HTTP 方法就是操作。新人上手快。
- 无状态带来高可扩展性:服务器不用记 Session,随便加节点。
- 缓存友好:利用 HTTP 本身的缓存机制,性能提升立竿见影。
- 语言无关:不管前端用 React、Vue 还是 iOS、Android,都能调。
- 生态成熟:各种工具、框架、文档生成器都支持。
个人建议:如果你的团队刚起步,或者项目生命周期长,选 REST 基本不会错。它经得起时间考验。
1.4 适用场景与不适用场景
REST 不是万能的。我见过有人非要用 REST 做实时推送,结果搞出一堆轮询代码,又丑又慢。
适合用 REST 的场景:
- CRUD 为主的业务系统(用户管理、订单、商品)
- 移动端 API
- 开放 API(给第三方开发者调用)
- 微服务之间的同步调用
不太适合的场景:
- 实时通信(用 WebSocket 更合适)
- 高频小数据交互(用 gRPC 性能更好)
- 复杂查询和报表(用 GraphQL 更灵活)
一句话总结:REST 是「资源导向」的,如果你的业务天然适合用「名词+动词」来表达,那就选 REST。如果业务是「事件驱动」或「实时流式」的,换个方案吧。
好了,这一章我们聊了 REST 是什么、六个约束、优势和场景。下一章我会带你手写第一个 RESTful API,从设计 URL 到实现代码,咱们一步步来。