RESTful 和 GraphQL 是两种不同的 API 设计范式,它们在数据交互方式、灵活性和实现逻辑上有显著区别。以下是它们的核心差异和具体示例:
核心区别对比
特性 | RESTful | GraphQL |
---|---|---|
数据获取方式 | 多个端点返回固定结构 | 单一端点,客户端自定义返回字段 |
HTTP 方法 | 依赖 GET/POST/PUT/DELETE | 主要用 POST(查询)和 GET(Schema) |
请求数量 | 可能需要多次请求(N+1 问题) | 单次请求获取嵌套数据 |
版本控制 | 通过 URL 版本号(如 /v1/users ) | 通过 Schema 演进,无显式版本 |
错误处理 | 依赖 HTTP 状态码(200/404/500 等) | 统一返回 200,错误信息在响应体中 |
缓存机制 | 天然支持 HTTP 缓存 | 需手动实现(如 Apollo 缓存) |
文档化 | 依赖 Swagger 等工具 | 内置强类型 Schema 自文档化 |
示例对比
场景:获取用户及其订单信息
假设需要以下数据:
- 用户基础信息(ID、姓名)
- 用户最近 3 个订单(订单号、金额)
1. RESTful 实现
请求 1:获取用户信息
GET /users/123
响应:
{
"id": 123,
"name": "Alice",
"email": "alice@example.com"
}
请求 2:获取用户订单
GET /users/123/orders?limit=3
响应:
[
{"orderId": "A1", "amount": 100},
{"orderId": "A2", "amount": 200},
{"orderId": "A3", "amount": 300}
]
问题:需要 2 次请求,可能返回冗余字段(如 email
)。
2. GraphQL 实现
单次请求:
query {
user(id: 123) {
id
name
orders(limit: 3) {
orderId
amount
}
}
}
响应:
{
"data": {
"user": {
"id": 123,
"name": "Alice",
"orders": [
{"orderId": "A1", "amount": 100},
{"orderId": "A2", "amount": 200},
{"orderId": "A3", "amount": 300}
]
}
}
}
优势:单次请求获取精确数据,无冗余字段。
复杂查询示例
场景:获取用户 + 订单 + 订单中的商品详情
query {
user(id: 123) {
name
orders {
orderId
items {
productId
quantity
product {
name
price
}
}
}
}
}
响应:
{
"data": {
"user": {
"name": "Alice",
"orders": [
{
"orderId": "A1",
"items": [
{
"productId": "P1",
"quantity": 2,
"product": {"name": "Laptop", "price": 999}
}
]
}
]
}
}
}
选择建议
- 使用 RESTful:
✅ 简单应用,需强缓存
✅ 需要标准化的 API 设计
✅ 微服务间简单数据交互 - 使用 GraphQL:
✅ 复杂前端需求(如聚合多源数据)
✅ 移动端需减少请求次数
✅ 快速迭代避免版本冲突
两者并非互斥,实际项目中可结合使用(如 REST 处理简单请求,GraphQL 处理复杂查询)。