RESTful 和 GraphQL 是两种不同的 API 设计范式,它们在数据交互方式、灵活性和实现逻辑上有显著区别。以下是它们的核心差异和具体示例:


核心区别对比

特性RESTfulGraphQL
数据获取方式多个端点返回固定结构单一端点,客户端自定义返回字段
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 处理复杂查询)。

END
本文作者:
文章标题: RESTful 和 GraphQL 的区别对比
本文地址: https://blog.imwlw.com/archives/38/
版权说明:若无注明,本文皆 ITShare Studio 原创,转载请保留文章出处。
最后修改:2025 年 02 月 21 日
如果觉得我的文章对你有用,请随意赞赏