在2026年的任何开发者论坛上,你仍然会看到同样的激烈争论:REST忠实拥护者与福音派GraphQL支持者,双方都拿着能证明对方错误的基准测试。这场争论已经持续了十多年,产生的热度远大于启发。与此同时,发布实际产品的团队已经悄悄超越了意识形态,转而思考一个更平淡但更有用的问题:哪个更适合这个特定问题?本文是一位实践者对这一问题的诚实回答,涵盖了这两种技术目前的实际状况,各自的优势所在,以及如何做出不会在六个月后后悔的选择。
2026年的REST:成熟、有立场,但仍被低估
在GraphQL发展的同时,REST并非停滞不前。围绕它的生态系统已经相当成熟,忽视这种成熟度会导致团队低估他们已有的资源。
OpenAPI 3.1与工具复兴
OpenAPI 3.1弥合了规范格式与JSON Schema之间的长期差距,这意味着你的契约文件现在可以从单一事实来源驱动代码生成、验证、模拟和文档。像Speakeasy、Stainless和更新后的OpenAPI Generator这样的工具可以从单个YAML文件生成跨十几种语言的SDK质量客户端代码。如果你的主要关注点是让第三方开发者拥有一个稳定、文档完善的接口来构建应用,那么2026年的REST工具生态确实非常出色。
实际结果是,一个维护良好的OpenAPI规范在很大程度上消除了”REST是无类型混乱”的批评。契约优先开发,结合在CI时强制执行规范的工具,产生的API与GraphQL schema一样具有可预测性。纪律必须来自团队,但现在的工具使得执行这种纪律变得轻而易举。
HATEOAS:现实检验
REST规范技术上包括HATEOAS——即响应中包含有效后续操作的链接,使API能够自我文档化和导航,无需额外知识。实际上,几乎没有任何生产REST API实现了完整的HATEOAS,大多数团队已经停止假装他们会这样做。GitHub的API包含一些链接头。Stripe的API经过精心文档化但不是超链接驱动的。2026年的诚实立场是,实践中的REST意味着面向资源的URL、标准HTTP动词、有意义的状态代码和已发布的OpenAPI契约。这是一种有用、一致的风格,即使它未能达到Fielding论文的完整愿景。
接受这一现实的团队停止在理论纯粹性上浪费精力,专注于真正重要的事情:一致性、版本控制策略和文档质量。
缓存:REST的结构性优势
HTTP 缓存并非 REST 附加的功能 — 它是内置在协议中的。GET 请求默认可缓存。Cloudflare、Fastly 和 AWS CloudFront 等 CDN 提供商原生理解 HTTP 语义。返回产品目录的 REST 端点只需一个 Cache-Control 头即可在边缘进行全球缓存。客户端、每个中间代理和每个 CDN 层都能理解这些规则,无需自定义配置。
这种结构优势在规模扩大时会累积。一个高流量的公共 API,如果主要处理读取请求,可以通过边缘缓存抵御巨大负载,使源服务器几乎保持空闲。GraphQL 几乎将所有内容路由到单个 POST 端点,需要专门的缓存基础设施 — 持久化查询、标准化的客户端缓存(如 Apollo 的 InMemoryCache 或 urql 的文档缓存)— 才能达到类似的效率。这些工具确实有效,但它们是额外的组件,而 REST 完全不需要。
2026 年的 GraphQL:联邦、流式传输与成熟
GraphQL 早期的声誉由 Meta 的内部用例和一波热情所塑造,这种热情超过了生产经验。到 2026 年,这项技术已经积累了足够的经验教训,在合适的场景中变得真正有用。
联邦 v2 与超级图
Apollo Federation v2 以及 Guild/Hive 在模式组合方面的竞争方法,使得”作为微服务统一层的 GraphQL”模式在生产规模上变得可行。而不是成为瓶颈的单体 GraphQL 服务器,联邦让每个服务拥有自己的模式片段。网关将这些片段拼接在一起,客户端看到一个连贯的 API。
这种模式解决了一个真实的组织问题。当二十个团队各自拥有一个微服务时,协调单一的 REST 聚合层会产生政治和技术摩擦。联邦让团队能够独立工作,而平台团队维护组合规则。拥有大型内部 API 表面的公司 — Netflix、Expedia 和其他公司 — 已经记录了这种模式在生产环境中的成功应用。
缺点是运营复杂性。你现在需要管理网关、模式注册表、子图部署和组合检查。对于一个五人团队来说,这种基础设施几乎肯定是过度设计。但对于服务于数十个内部团队的平台来说,这种复杂性是值得的。
持久化查询与性能故事
GraphQL 早期的性能弱点之一是每次请求都在网络上发送完整的查询字符串,以及在 CDN 层缓存 POST 请求的困难。持久化查询 — 客户端在构建时注册查询哈希,运行时只发送哈希 — 解决了这两个问题。服务器将哈希与已知良好的注册表进行验证,执行存储的查询,如果操作是只读的,响应可以像任何 GET 请求一样被缓存。
像 Apollo 的 Safelisting 和 Stellate(前身为 GraphCDN)这样的平台已经使这种模式变得实用。这也带来了提高安全性的副作用,因为生产环境中不再可能执行来自未知客户端的任意查询。运营开销是真实存在的——你需要在构建管道中添加查询注册步骤——但对于高流量应用来说,这是值得的。
延迟加载和流式传输:增量交付
@defer 和 @stream 指令现已标准化在 GraphQL 规范中,允许单个查询立即返回关键数据,并将较慢的字段延迟到它们准备就绪时。产品页面查询可以在第一个数据块中返回标题、价格和主要图片,而推荐信息和评论聚合则通过同一连接增量到达。
对于之前需要多个顺序 REST 调用或单个慢速调用的复杂前端页面,这是一个有意义的改进。它与 React 的 Suspense 模型及其他框架中的类似模式配合良好。需要注意的是,你的服务器、客户端库和中间基础设施都需要正确支持 HTTP 多部分响应。到 2026 年,支持已经很广泛,但并非普遍。
N+1 问题并未消失
N+1 问题——解析项目列表会为每个项目触发单独的数据库查询——是 GraphQL 最可靠的陷阱。类似 DataLoader 的批处理可以解决这个问题,但这需要纪律性。每个与数据存储交互的解析器都需要考虑批处理来编写,否则在开发中看起来无害的查询,当列表增长时在生产环境中会猛烈冲击数据库。
有经验的 GraphQL 团队将 DataLoader 视为必备基础设施,而不是可选的优化。新接触 GraphQL 的团队往往需要通过艰难的方式吸取这个教训。REST API 并非不受类似低效率的影响,但这个问题在结构上不太被鼓励——列表资源的 REST 端点自然会在一个查询中获取整个列表。
性能比较:数字实际告诉你的信息
REST 和 GraphQL 之间的基准比较几乎总是具有误导性,因为它们衡量的东西是错误的。有意义的性能因素是数据传输量、请求数量、缓存有效性和数据库查询效率——所有这些都严重依赖于 API 的设计和使用方式,而不是你选择的技术。
GraphQL 的主要性能论点是防止数据获取不足和过度获取。需要二十个字段资源中五个字段的移动客户端可以避免下载它将忽略的十五个字段。在规模上,在带宽受限的移动网络上,这很重要。REST 团队通过稀疏字段集(?fields=id,name,price)解决同样的问题,但这需要在每个端点上明确进行设计工作,而不是 GraphQL 提供的结构性保证。
REST的主要性能优势在于HTTP缓存。精心配置缓存头的REST API可以将全球绝大多数读取请求的延迟降至个位数毫秒,通过CDN边缘节点提供服务。GraphQL可以通过持久化查询和CDN感知的基础设施接近这一性能,但它需要专门配置缓存,而不是像REST那样自然继承缓存能力。
对于网络连接不稳定的移动应用,请求数量最为关键,因为每次往返都会带来真实的延迟。GraphQL在这方面具有结构性优势——一个查询就能完成原本需要五次REST调用的数据获取。REST可以通过专门设计的聚合端点来弥补,但随着前端的发展,这些端点会成为维护负担。
开发者体验:真实对比
GraphQL的开发者体验具有吸引力。模式本身就是文档。GraphiQL和Apollo Sandbox等工具使探索变得即时。类型系统可以在构建时捕获客户端和服务器之间的不匹配。对于多年来一直在逆向工程未记录的REST响应的前端开发者来说,这确实是革命性的变化。
后端体验则更为复杂。设计良好的GraphQL模式需要同时仔细考虑对象图、授权边界和解析器性能。一旦客户端依赖了这些模式,设计错误就很难修复——虽然可以使用弃用机制,但这会产生长期存在的遗留字段。REST端点可以进行更精细的版本控制。
借助OpenAPI工具,REST的开发者体验已显著改善。Swagger UI和Redoc生成清晰的文档。Postman、Insomnia和Bruno使测试变得简单。从OpenAPI规范生成的TypeScript代码为前端开发者提供了曾经似乎只有GraphQL才有的类型安全。两者之间的差距已显著缩小。
安全考量
在选择之前,了解两种方法的不同安全面至关重要。
REST的安全模型自然映射到HTTP语义。按端点进行速率限制、按路由进行授权检查、按URL进行审计日志记录,都可以通过标准中间件轻松实现。CDN层的DDoS保护原生理解HTTP方法和路径。
GraphQL引入了查询复杂度这一新的攻击向量。恶意或粗心编写的查询可能请求深度嵌套的关系,触发指数级的数据库负载。查询深度限制、复杂度评分和查询允许列表(通过持久化查询)都是生产环境中必要的防御措施。这些都不难实现,但需要刻意关注。没有这些防御措施的公开GraphQL端点是一个安全隐患。
GraphQL 中的授权也需要谨慎处理。REST 使得在路由级别应用授权变得自然。而 GraphQL 的解析器需要强制执行各自的授权规则,因为单个查询可以跨越多种资源类型。虽然存在字段级别的授权库,但其思维模型不同,出错的可能性也更大。
REST 的优势场景
对于数据结构稳定且客户端多样化的简单 CRUD API,REST 是默认的正确选择。如果您正在构建第三方开发者将集成的公共 API,REST 的熟悉度、可缓存性和工具生态系统使其具有决定性优势。大多数开发者无需阅读关于您特定选择的文档就知道如何使用 REST。大多数 API 网关、监控工具和安全设备都内置了深度 REST 支持。
当 CDN 缓存是首要考虑因素时,REST 也占据优势。新闻网站、产品目录、公共数据 API——任何被多个客户端读取相同数据的内容——都可以利用 HTTP 缓存,以未缓存的 GraphQL 端点基础设施成本的一小部分来处理流量。
与一两个其他服务通信的简单内部微服务很少能从 GraphQL 的灵活性中受益。当几个明确定义的端点可以用更少的仪式完成相同目的时,模式管理、解析器设计和工具配置的开销是不合理的。
GraphQL 的优势场景
GraphQL 在多个客户端间数据需求高度多变的环境中证明其复杂性是值得的。移动应用、桌面 Web 客户端和需要不同数据子集的合作伙伴集成,这些都是自然契合的场景。模式只需定义一次契约;每个客户端精确查询所需内容,而无需后端团队构建和维护客户端特定的端点。
Backend-for-Frontend (BFF) 模式是 GraphQL 在生产环境中找到最强立足点的地方。位于一组微服务和特定前端应用之间的 GraphQL 层可以精确地聚合、转换和塑造数据以满足该前端的需求。前端团队拥有 BFF,可以自由查询它,而上游服务则保持与前端关注点的解耦。
多个团队共同贡献共享 API 表面的大型组织受益于联邦架构的能力,它使团队能够独立工作,同时保持模式的一致性。这是 REST 的版本模型无法清晰复制的一个真正的组织优势。
快速的前端迭代是 GraphQL 的另一个优势。当前端快速演进且数据需求在每个冲刺中都发生变化时,能够添加查询字段而无需触碰后端,这显著加速了开发。REST 的每资源一个端点模型要求大多数前端数据变更都需要后端参与。
并排对比:决策表
| 因素 | REST | GraphQL |
|---|---|---|
| HTTP 缓存(CDN) | 原生,零配置 | 需要持久化查询 + CDN 设置 |
| 公共/第三方 API | 明显优势 | 可行但不常见 |
| 多个前端客户端 | 需要特定于客户端的端点 | 架构结构化处理 |
| 带宽有限的移动设备 | 存在过度获取数据的风险 | 精确的字段选择 |
| 简单的 CRUD 微服务 | 开销低,构建快速 | 对大多数情况来说过于复杂 |
| BFF 模式 | 可行但冗长 | 为此专门设计 |
| 多团队架构所有权 | 协调开销 | 联邦架构解决了这个问题 |
| 安全表面区域 | 更容易理解 | 查询复杂性需要主动防御 |
| OpenAPI/SDK 生成 | 成熟的生态系统 | 正在改进但不等价 |
| 实时/流式传输 | SSE 或 WebSocket 附加组件 | 订阅 + 延迟/流式传输内置功能 |
| 学习曲线(后端) | 较低 | 架构设计和解析器模式需要时间 |
| 快速前端迭代 | 通常需要后端更改 | 前端驱动的查询演进 |
实用的决策框架
不要从技术偏好开始,而是从关于您特定情况的这四个问题开始。
您的客户是谁?如果您只有一个已知的团队为已知的设备类型构建前端,那么两种方法都可行。如果您有具有不同数据需求的多样化客户——移动设备、网页、第三方集成、合作伙伴 API——GraphQL 的灵活性会带来回报。如果您的客户是您从未见过的外部开发者,REST 的熟悉度和文档生态系统难以被超越。
您的读取模式是什么?如果您的大部分流量是可缓存的读取——产品目录、公共内容、参考数据——使用 CDN 缓存的 REST 可以显著降低基础设施成本。无论使用何种技术,如果您的读取是高度个性化的且不可缓存,这种优势就会消失。
你的团队有什么经验? GraphQL 的上限很高,但下限也很高。没有 GraphQL 生产经验的团队往往会低估所需的模式治理、N+1 问题警惕性和授权复杂性。一个熟悉 REST API 的团队构建的 REST API 会胜过一个边学边用 GraphQL 的团队构建的 GraphQL API。相反,如果你有经验丰富的 GraphQL 工程师,因为意识形态让他们参与 REST 项目,会损失他们的生产力。
你的组织结构是怎样的? 如果多个团队需要共同贡献一个共享 API,GraphQL 联合的模式分布式所有权模式是一个真正的优势。如果一个团队拥有一个 API,这种优势就不适用。
做出正确决策的团队是那些将其视为工程权衡,而非身份声明的团队。技术选择应该服务于产品,而不是简历。
还有一个实际需要注意的:决策并不总是二选一的。许多成熟的平台同时运行两者。面向公众的 API 和合作伙伴集成使用 REST,因为它可缓存且开发者熟悉。内部平台 API 和 BFF 层使用 GraphQL,因为它灵活且具有聚合能力。为每个问题领域选择合适的工具比选择一个标准并到处应用更具说服力。
目标是 API 能够高效地服务其客户端,你的团队能够可靠地操作,并且技术债务的增长速度不会超过你偿还的速度。到 2026 年,REST 和 GraphQL 都可以实现这一目标。问题是哪一个在你的特定情境下更自然地实现这一目标——如果你愿意诚实地权衡利弊,而不是选择你已经喜爱的技术,这个问题就有真实的答案。
Michael Sun 是 Novvista 的软件工程师和技术作家,专注于后端架构、API 设计和开发者工具。他已在多个组织中大规模构建和维护了生产级的 REST 和 GraphQL API。
