REST vs GraphQL 在实践中的权衡,后端与前端团队

发布: (2026年1月4日 GMT+8 03:58)
9 min read
原文: Dev.to

I’m happy to translate the article for you, but I need the full text of the article (the content after the source line) in order to do so. Could you please provide the rest of the article you’d like translated?

概述

如果你曾经为真实产品构建过 API,你大概已经听过 GraphQL 的宣传口号:不再出现过度获取,客户端只请求它们真正需要的内容,查询灵活,前端团队开心! 如果你和我一样,也一定被至少一个 RESTful API 烧过,它会变成一个脆弱的端点迷宫,充斥着版本 hack 和意外的验证错误。

让我们跳过炒作,基于真实的工程痛点而不是会议幻灯片来讨论选择 REST 还是 GraphQL。以下是我在构建、破坏以及维护两者过程中学到的经验。

设置:当两者看起来都是好选项

我遇到的几个真实场景:

  • REST API for a B2B SaaS – 使用 .NET Core 构建,被 Angular 以及后来的 React 消费。起初很简单,但后来增长……非常快。
  • Internal microservices with Python + FastAPI – 需要从多个后端编排数据,同时为网页和机器学习客户端提供服务。
  • Greenfield AI‑powered product – React 前端,异步后台任务,大量自定义业务逻辑,需求变化快速。

理论上,REST 和 GraphQL 都可以适用于这三种情况。实际操作中,每次的最佳选择却各不相同。

当 REST 正常工作

清晰的资源建模

REST 在你的业务领域能够整齐映射为资源时表现最佳:

/users
/orders
/reports

它可预测、易于缓存,并且与 HTTP 语义(状态码、幂等性、认证)配合良好。

为什么这很重要: 有了明确的资源边界,REST 接口即使在复杂度提升时仍然易于理解。通过 URL 或 Header 进行版本控制也很直接。监控、日志记录和错误处理变得乏味——但这是一种好乏味。

验证与错误处理

REST 的状态码迫使你思考错误语义。如果你在与第三方消费者集成或构建公共 API,这种可预测性就是金子。我在解释 REST 错误格式上花的时间远少于 GraphQL 错误负载——相差甚远。

REST 开始腐烂的地方

  • 更改前端需求 – 曾经有项目经理要求在 API 响应中再加一个字段吗?乘以 10,你的端点就会膨胀。
  • N+1 端点 – 我见过 /users/users/details/users/details-with-orders/users/recent 等等的 API。维护噩梦。
  • 过度获取 – 发送 20 个字段,而 UI 只需要 3 个。把它乘以 1 万用户的网格,你就会看到云费用飙升。

GraphQL 真正发挥价值的场景

灵活的数据获取

React 应用喜欢 GraphQL,因为你可以根据 UI 需求定制查询。不再需要等待后端团队去添加某个字段。在一个快速迭代、拥有众多 UI 变体的产品中,这简直是改变游戏规则的利器。

示例:仅查询所需字段

query {
  user(id: "123") {
    name
    email
    orders(limit: 2) {
      date
      total
    }
  }
}

如果前端迭代迅速而后端相对稳定,GraphQL 让团队能够在无需频繁后端修改的情况下交付功能。

跨服务聚合

在构建一个将多个服务拼接在一起的 Python/FastAPI 网关时,GraphQL 成了救星。一个端点对应多个数据源,客户端决定响应的结构。这简化了前后端之间的契约,避免了双方在 API 请求上来回“乒乓”。

我遇到的 GraphQL 痛点

  • 伪装的 N+1 查询 – 你的 GraphQL API 的质量取决于解析器。我见过生产系统因每个 orders 字段触发单独的数据库查询而陷入停滞。缓存和 dataloader 模式是必不可少的,但要后期加入并不容易。
  • 验证与错误处理 – 与 REST 不同,GraphQL 默认返回 200 OK,即使出现部分错误。客户端必须解析 errors 字段,这在监控和告警时不够直观。如果你在乎 SLA,这会成为隐患。
  • 授权烦恼 – 细粒度的字段级权限是可以实现的,但实现过程非常复杂。我比在 REST 中更常需要调试“为什么用户 X 能获取字段 Y?”的问题。

来自真实项目的实用指南

何时选择 REST

  • 你的数据模型能够干净地映射为资源。
  • 需要强大的 HTTP 语义(幂等性、状态码、缓存)。
  • 正在向第三方公开 API,或希望实现简易的 API 版本管理。
  • 前端与后端之间的契约相对稳定。

何时选择 GraphQL

  • UI 变化频繁,前端团队需要独立推进。
  • 你的 API 是多个数据源/服务的统一入口。
  • 过度获取导致真实的性能或成本问题。
  • 前后端工单来回拖慢了开发进度。

避免这些陷阱

  • 不要仅因为 GraphQL 很新潮就使用它。 如果没有解决前端痛点,只会增加复杂度。
  • 不要为每种可能的客户端组合都构建 REST 端点。 这往往意味着你可能需要 GraphQL 或更好的 API 设计。
  • 两者皆需: 投入合同测试和监控。如果消费者和生产者之间的同步出现偏差,两种风格都可能腐化。

如果我能重新来一次…

  • 我会先用 REST 进行原型开发,除非有明确的痛点只有 GraphQL 能解决。REST 更易调试,托管成本更低,对大多数团队也更友好。
  • 如果选择 GraphQL,我会从缓存和 dataloader 模式开始,而不是事后再加上去。我还会提前记录错误处理和认证方式,以免在生产环境中出现意外。
  • 对于混合系统,我会考虑同时提供两种接口(REST 用于集成伙伴,GraphQL 用于内部 UI),但必须划清界限并尽量避免重复。

可操作的要点

  • 审计当前的 API 使用者。 你在哪些地方出现了过度获取或不足获取?你的端点是否在复杂度或数量上膨胀?

  • 在两者中原型化一个真实用例。 不要仅凭白板做决定。构建一个完整的端到端流程,看看哪种方式更易于维护和演进。

  • 记录你的验证和错误策略。 REST 和 GraphQL 都需要一致且可发现的错误处理。不要把它当作事后才考虑的事项。

生产环境中你遇到的最大 API 痛点是什么?是 REST 还是 GraphQL 帮助了你,还是让情况更糟?当合约在飞行中改变时,你如何处理验证和错误报告?

在评论中分享你的故事、伤痕或反例。如果你有拯救了局面的模式或代码片段,快贴出来吧!

Back to Blog

相关文章

阅读更多 »

别再像2015年那样写API

我们已经进入2025年,仍有许多代码库把 API 视为简单的“返回 JSON 的端点”。如果你的 API 设计仍停留在基本的 CRUD 路由上,你正……

从混乱到秩序的前端

它是如何工作的 - 后端为微服务更新 GraphQL schema。 - 前端拉取最新的 schema,创建查询/变更并重新生成 type。 - 任何…