REST API 与 GraphQL
无抓取抓取 API 提供特定任务的 HTTP 操作,用于结构化的公共 web 数据,为此架构比较提供了具体的 REST 风格边界。
简而言之
- REST 根据资源和 HTTP 语义组织接口。 服务器通常拥有表示形状,每个资源都有一个可寻址的边界。
- GraphQL 根据类型模式组织接口。 客户端通过经过验证的操作文档选择允许的字段和关系。
- 两种方法的速度都不自动更快。 往返、负载大小、解析器工作、缓存行为和存储访问决定测量结果。
- 缓存的差异超出了 JSON 语法的范围。 REST 自然映射到通用的 HTTP 缓存,而 GraphQL 通常需要基于操作的或规范化的缓存。
- 两者可以共存。 稳定的公共 REST 视图和灵活的第一方 GraphQL 视图可以共享服务和数据存储。
REST API 与 GraphQL 实际比较的内容
REST 是一种围绕资源、表示和统一接口构建的架构风格,而 GraphQL 是一种查询语言、类型系统和执行模型,允许客户端从模式中请求字段。这两者都可以使用 HTTP 并返回 JSON,但它们暴露不同的合约,并在不同地方集中复杂性。
比较并不是多个端点与一个端点。REST 可以支持复杂查询和稀疏字段,而 GraphQL 部署可以使用多个端点、持久化操作、网关和缓存。持久的差异在于谁控制响应选择以及如何描述、演变、安全和观察合约。
REST API 与 GraphQL 的有用边界是责任单位。一个选项可能定义数据格式、协议、模型或自动化库,而另一个在 REST API 与 GraphQL 的背景下定义围绕它的工作流。将不同层视为替代品会导致薄弱的架构决策:团队比较标签,错过执行边界,后来发现在 REST API 与 GraphQL 的背景下,两者都是必要的组成部分。良好的比较阐明每个选项所接收的内容、所改变的内容、所返回的内容,以及谁在 REST API 与 GraphQL 的背景下操作周围系统。
就 REST API 与 GraphQL 的实施决策而言,从所需输出和允许的失败模式开始。在选择技术之前,写下更新性、延迟、确定性、浏览器覆盖、数据所有权、可观察性和维护期望,确保选择能够根据这些期望进行测试。一个熟悉的工具并不自动是正确的工具,而一个较新的抽象也并不自动是升级,当一个较小的确定性组件已经在 REST API 与 GraphQL 的背景下满足合约时。
REST API 与 GraphQL 一瞥
有用的比较遵循责任、失败模式和操作边界,而不是语法或品牌熟悉度,在 REST API 与 GraphQL 的背景下。
| 维度 | REST API | GraphQL |
|---|---|---|
| 主要合同 | 资源、方法、表示、链接和状态语义 | 类型模式、操作、字段、参数和可空性 |
| 响应形状 | 通常由服务器选择 | 由客户端在模式内选择 |
| 缓存 | 直接使用 HTTP 标识符和验证器 | 基于操作的网关或规范化客户端策略 |
| 错误 | HTTP 状态加应用程序错误主体 | 请求错误或带字段错误的部分数据 |
| 需求控制 | 端点、方法、参数和表示限制 | 深度、广度、字段成本、分页和解析器限制 |
比较矩阵使 REST API 与 GraphQL 变得具体,因为每一行描述的是操作后果,而不是营销形容词。从工作负载向外读取行:首先识别输入和预期结果,然后检查控制流、状态、可移植性和操作成本在 REST API 与 GraphQL 的上下文中。一行只有在改变真实需求时才重要。例如,广泛的语言支持对多语言组织来说是有价值的,但对一个已经拥有其浏览器运行时的较小 TypeScript 服务则无关紧要。
REST 通常为基础设施提供可见的资源边界,而 GraphQL 为产品客户端提供可见的类型和字段边界。首选的边界是团队在真实流量下能够管理的边界,而不是产生最短演示请求的边界。
两种方法如何运作
REST 客户端寻址一个资源,应用 HTTP 方法,提供头部或主体,并接收由服务器语义管理的表示。
GraphQL 服务解析并验证操作与其模式的匹配,解析选定字段,应用可空性规则,并生成如选择所示的响应。因此,解析器扩展、嵌套字段的授权、操作复杂性和部分错误应属于生产设计,而不是隐藏在单个端点后面。
REST API 与 GraphQL 的生产设计应在日志和指标中暴露这些内部阶段。记录所选路径、提供给该路径的输入、返回的工件的身份以及验证结果,在 REST API 与 GraphQL 的背景下。如果没有阶段级证据,成功的网络请求可能会隐藏空数据,流畅的模型响应可能会隐藏缺失的工具调用,而浏览器脚本可能会隐藏导航到错误页面的情况,在 REST API 与 GraphQL 的背景下。可观察性存在于意义变化的边界上。
从工作负载约束中选择
正确的选择取决于在REST API与GraphQL的背景下,必须变得更简单、更安全或更可观察的阶段。
选择REST用于稳定的资源工作流
公共API、文件传输、Webhook、条件请求和简单的资源操作受益于熟悉的HTTP行为。
选择GraphQL用于组合产品客户端
多个第一方接口可以通过一个受管理的架构请求不同的嵌套视图。
在共享服务后使用两者
GraphQL产品层和REST集成层可以重用领域逻辑,同时保持不同的合同。
保持当前接口
没有经过测量的客户端、治理或操作收益的迁移仅仅是转移复杂性。
上述案例是起始点,而不是永久标签。当数据源、浏览器矩阵、模型行为、合规边界或团队所有权发生变化时,重新评估REST API与GraphQL。原型通常优化设置速度,而生产系统必须在REST API与GraphQL的背景下优化证据、访问控制、可预测的失败和可支持性。将选择记录在一个简短的决策记录中,以便下次迁移基于原始约束,而不是REST API与GraphQL背景下的民间传说。
根据一个代表性的工作负载记录决策,然后在源行为、流量形状、团队所有权或准确性要求变化时重新审视它,在REST API与GraphQL的背景下。
常见比较错误
大多数糟糕的决定来自比较标签,而未定义操作合同。
- 声称REST总是过度提取。 字段参数、定制表示和专用端点可以控制有效负载。
- 声称GraphQL消除了往返。 嵌套解析器可以将往返从客户端移到服务器。
- 将一个HTTP状态作为整个GraphQL错误模型。 字段错误和部分数据需要对操作感知的处理。
- 忽略查询成本。 有效操作仍然可能对服务过于宽泛或昂贵。
- 通过URL计数进行迁移。 合同兼容性、授权、缓存、可观察性和客户端行为比端点数更重要。
每个REST API与GraphQL的陷阱应映射到可观察的检查。验证最终页面或源身份,检查所需字段而不是信任状态码,保留产生结果的确切配置,并在REST API与GraphQL的背景下将获取与转换分开。这将关于工具的争论转变为对失败合同的诊断。它还可以防止大范围的变化掩盖第一个破损边界。
在REST API与GraphQL设计中保持安全性和合规性。使用授权的公共源,尊重适用条款和爬虫偏好,最小化保留数据,并在REST API与GraphQL的背景下将凭据保留在日志和内容之外。一个技术上能力的浏览器、爬虫、代理或API客户端并不授予权限。操作员仍然对目标范围、数据处理、工作负载限制和后果行为的人力批准负责,在REST API与GraphQL的背景下。
运行公平的概念验证
一个有用的证明在REST API与GraphQL的背景下保持源、预期输出、验证规则和测量窗口不变。
- 选择三个代表性的客户端操作,包括一个嵌套读取和一个失败案例。
- 定义预期字段、授权结果、缓存策略、延迟边界和错误含义。
- 实现等效的REST和GraphQL路径,而不改变基础业务规则。
- 捕获客户端往返、传输字节、服务器工作、缓存行为和正确性。
- 进行模式演变、弃用、部分失败和无效需求控制。
- 选择总合同对提供者和消费者来说更易于维持的接口。
在承诺全平台迁移之前,使用小型代表性语料库运行REST API与GraphQL评估。包括一个正常案例、一个缺失字段案例、一个动态或有状态案例(如相关),以及一个故意无效的控制,在REST API与GraphQL的背景下。无效控制很重要:如果它通过,接受测试测量的是传输而不是REST API与GraphQL背景下的正确性。将证据保留在决策记录旁边,以便未来版本更改可以评估在REST API与GraphQL的背景下的相同工作负载。
在决策旁边保留捕获的输入和接受结果,以便之后的迁移可以在REST API与GraphQL的背景下与相同的证据进行比较。
测量完整合同
操作信号只有在与返回数据的语义检查配对时才重要,在REST API与GraphQL的背景下。
| 信号 | 要测量什么 | 为什么重要 |
|---|---|---|
| 正确性 | 模式有效响应和授权结果 | 防止有效负载灵活性隐藏错误数据 |
| 需求 | 操作深度、选定字段和解析器或端点工作 | 显示客户端请求如何产生服务器成本 |
| 缓存 | 命中率、验证器和失效行为 | 衡量可重用工作 |
| 操作 | 尾延迟、错误类别和跟踪清晰度 | 衡量生产支持能力 |
在用户获得价值的层面上衡量 REST API 与 GraphQL。框架启动时间、令牌计数或响应状态可能是有用的诊断,但在 REST API 与 GraphQL 的上下文中没有任何证明输出是正确的。将操作性措施与语义接受相结合:预期的记录计数、支持的引用、所需的浏览器状态、符合模式的文档或 REST API 与 GraphQL 上下文中的确认操作。按类别存储故障,以便团队可以查看质量是否受到输入、控制流、执行或验证的限制,REST API 与 GraphQL 的上下文。
主要参考锚定比较: GraphQL 工作草案, HTTP 语义规范, 和 HTTP 缓存规范. 这些来源定义了技术本身;它们比在 REST API 与 GraphQL 的比较页面之间复制的功能表更有力。版本特定的细节在实现升级时应再次检查。
REST API 与 GraphQL 的实用选择
当资源语义和通用 HTTP 基础设施符合消费者合同时选择 REST。当类型化的、客户端选择的组合数据证明模式治理和解析器操作的合理性时选择 GraphQL。当边界保持明确时,混合设计是有效的。
REST API 与 GraphQL 比较的实际结果是一个边界,而不是一个普遍的赢家。选择满足当前合同的最小系统,在语义变化的地方对其进行测量,并为尚未在 REST API 与 GraphQL 的上下文中出现的要求保留升级路径。当工作负载需要受管理的渲染或代理控制的浏览器会话时,抓取 API 可以提供该执行层,而应用程序保持目标、模式和接受检查的所有权,REST API 与 GraphQL 的上下文。
准备测试工作流吗?
通过无抓取抓取 API 对一个结构化的公共数据任务建模,并在选择更广泛的接口样式之前验证响应合同。
今天注册并获得 5 美元的免费信用 — 无需信用卡.
领取您的 5 美元信用 →常见问题
GraphQL 比 REST 更快吗?
GraphQL 并不是固有的更快。它可以减少客户端的往返次数或传输的字段,而解析器的扇出和操作感知缓存可能会增加服务器的工作量。
GraphQL 可以替代 HTTP 吗?
不可以。GraphQL 通常使用 HTTP 作为传输,并且仍然需要身份验证、传输安全、容量控制和操作策略。
哪个方法更容易缓存?
REST 更直接映射到通用 HTTP 缓存。GraphQL 可以很好地缓存,但策略通常理解操作、持久化查询或规范化实体。
一个系统可以同时暴露两者吗?
可以。REST 和 GraphQL 层可以调用相同的域服务,同时向不同的消费者呈现不同的合同。
哪个更适合公共 API?
答案取决于消费者工具、域形状、缓存需求、需求控制以及提供者支持合同的能力。