5月27日 22:33
GraphQL 与 REST API 的核心区别是什么
核心答案
GraphQL 和 REST 的根本区别在于谁决定返回什么数据:REST 由服务端定义固定响应结构,GraphQL 由客户端按需声明字段。这一差异向下传导,影响了端点设计、版本策略、缓存机制等几乎所有技术选型。
关键区别
数据获取 REST 需要多个端点拼装数据,容易过度获取或获取不足。GraphQL 单次请求即可精确拿到所需字段,典型场景:一个页面需要用户信息 + 订单列表,REST 要两次请求,GraphQL 一条 query 搞定。
端点与版本 REST 每个资源一个 URL,变更时走 v1/v2 版本控制。GraphQL 只有一个端点,通过 Schema 演进和字段废弃来避免破坏性变更,无需版本号。
缓存 REST 直接利用 HTTP 缓存(ETag、Cache-Control),成熟且零成本。GraphQL 因查询体在 POST 中,无法原生使用 HTTP 缓存,需要 Apollo Client 等方案在应用层实现。
错误处理 REST 用 HTTP 状态码(404、500)表达语义。GraphQL 无论成功失败都返回 200,错误信息放在响应体的 errors 字段中,客户端必须自行解析。
实时数据 REST 依赖轮询或 WebSocket 补丁方案。GraphQL 原生支持 Subscription,基于 WebSocket 实现服务端推送。
选型建议
- 选 GraphQL:多端异构客户端、复杂嵌套查询、移动端省流量、快速迭代频繁变更字段
- 选 REST:简单 CRUD、公共 API 需要易用性、团队不熟悉 GraphQL、强依赖 HTTP 缓存
追问方向
- GraphQL 的 N+1 查询问题怎么解决?(DataLoader 批量加载)
- 为什么说 GraphQL 不适合做文件上传?(二进制传输需 multipart,query 本身是 JSON,需额外规范)
- 两者能混用吗?(可以,REST 做健康检查/文件上传,GraphQL 做业务查询)