跳至内容
免费开始
返回博客

REST API 与 SOAP API:根据契约和行为进行选择

Gabriel Cioci最后更新于 2 min read
REST API 与 SOAP API:根据契约和行为进行选择

开始提取

免费试用 WebScrapingAPI

领取 1,000 个免费 API 积分。无需信用卡。

开始使用
简而言之:REST 是一种架构风格;SOAP 是一种基于 XML 的消息传递协议。应比较服务提供商的实际合同、支持的客户端、安全要求以及故障行为,而不是武断地认为 REST 就意味着 JSON,或者 SOAP 就意味着速度慢。

某供应商提供了一个用于下单的 SOAP 端点,以及一个被描述为 REST 的 HTTP 目录端点。你的团队需要的是可靠的库存数据,而不是在协议争论中分出胜负。在决定采用 REST API 还是 SOAP API 时,首先要区分两个不同的概念:REST 约束组件之间的交互方式,而 SOAP 则定义了一个包含信封和处理规则的消息传递框架。

这一区别将改变您需要提出的问题。JSON 响应并不能说明该服务是否使用了统一的接口;SOAP 信封也无法说明该部署是否需要消息签名或能否保证可靠交付。这些特性需要通过实际服务及其支持的规范来验证。

本指南以一个假设的供应商集成案例为例,从合同审查到故障处理进行全流程说明。 这些示例均为设计场景,并非针对真实供应商的可执行请求。您将了解到如何比较消息、评估工具、规划重试,以及在现有接口与新接口之间进行选择。同样的方法也适用于使用第三方 API 的数据工程团队:首先确定您所需的运营承诺,然后验证哪个接口能够实际兑现这些承诺。

将 REST API 与 SOAP API 视为合同决策

REST(全称 Representational State Transfer)是一种由无状态交互、缓存和统一接口等约束定义的架构风格。它既不是 JSON 格式,也不是模式语言,更不是每个 HTTP 端点的替代名称。原始的 REST 定义描述的是一种架构,而非预先规定的请求模板。

SOAP 定义了一种基于 XML 的封装结构以及消息处理模型。它还提供了一个可扩展性框架,并提供了一种将消息传递与底层协议绑定在一起的方法。SOAP 1.2 消息规范是该核心行为的主要参考依据。其他通常与 SOAP 相关联的功能则来自附加规范或特定的部署方案。

在评估具体实现之前,请参考以下对比来确定分类。“常见”描述的是一种实用模式,而非每个服务都必须遵循的规则。

维度

面向 REST 的接口

SOAP 接口

定义依据

交互方面的架构约束

消息信封和处理规则

通用集成模型

HTTP 上的资源与表示形式

通过定义好的绑定交换的结构化消息

表示格式

不限于 JSON

SOAP 信封使用 XML

用于请求的契约工件

接口和媒体类型文档,通常为 API 描述

服务描述、模式、绑定细节及策略要求

用于检查的错误信息

HTTP 状态码以及文档中记录的错误表示形式

SOAP 故障以及底层绑定的状态行为

需验证的安全性

实际传输、身份、授权和应用程序控制

上述控制措施以及任何必需的消息安全配置文件

性能证据

实际工作负载的测量数据

实际工作负载的测量数据

若需了解 REST 方面的更严格定义,请参阅六项 REST API 架构约束。即使未能满足所有约束,务实的 HTTP API 依然可能发挥作用。在对 REST API 与 SOAP API 进行评估时,请明确记录两者的区别,以免在比较中将未实现的特性归因于某个吸引人的标签。

通过两个接口追踪一项供应商操作

假设您需要产品 A17 的当前描述。面向资源的 HTTP 接口可能会通过 URI 标识该产品,并使用 GET 方法检索其表示形式。该表示形式可以是 JSON、XML 或其他受支持的媒体类型。方法语义和响应元数据是交互的一部分,而不仅仅是正文字段。

SOAP 接口可能会暴露一个产品查询操作,其输入包含产品标识符。客户端会将文档中规定的 XML 消息封装在 SOAP 信封中发送,然后解析相应的响应。在这个假设的服务中,业务操作通过消息契约来传达。 不要假设每个 SOAP 接口都是远程过程调用(RPC)风格的;SOAP 同样可以承载面向文档的消息。

两种实现都必须回答相同的领域问题:A17是产品还是可销售变体?适用哪种货币?描述是否经过本地化?缺失的库存字段表示零、未知还是未授权?没有任何传输方式能解决模棱两可的业务语义。

在测试 REST API 与 SOAP API 时,应先制定一套简短的预期领域结果,并将两种接口分别映射至该结果集。其中应包含现有产品、未知标识符、不可用字段以及无访问权限的调用者。比较客户端是否能在不检查可读消息中未记录字符串的情况下,区分这些结果。

在获得实际合同之前,请勿将请求示例纳入首次比较。编造一个看似合理的端点或 XML 命名空间可能会使集成看起来比实际更容易。请供应商提供已移除凭据的支持示例交换,然后确定所需的标头、媒体类型、命名空间 URI 和字段。

同时记录版本详情。SOAP 1.1 和 SOAP 1.2 并非仅仅因为都使用 XML 就能互换使用。它们的信封命名空间和 HTTP 约定存在差异。SOAP 1.2 第 2 部分描述了其 HTTP 绑定及相关特性;请使用供应商文档中明确的版本,而非混用不同版本的示例。

比较合同工具与变更管理

服务描述可以减少客户端的重复工作,但无法消除业务决策。生成的代码可能正确地序列化了一个日期,但您仍无法确定它代表的是供应商的本地日历日,还是协调世界时(UTC)中的某个时刻。请将生成的客户端视为合同工具,而非理解服务的替代品。

SOAP 服务通常将 WSDL 描述与 XML 模式结合使用。这些 artifacts 可以定义接口、消息类型、绑定和服务端点。W3C 的《WSDL 入门指南》对这些职责进行了说明。在假设所选工具能够处理特定供应商的描述之前,请先确认该工具支持的 WSDL 版本和扩展。

面向 REST 的 HTTP API 也可以拥有机器可读的描述、模式、生成的客户端以及严格的验证机制。REST 并不要求非正式的契约。反之,收到一个 WSDL 文件并不能证明实现遵循了该契约,也不能证明所有相关操作要求都包含在其中。

对于现有服务,请使用您计划部署的精确客户端堆栈来测试合同。导入相关构建产物,在提供方的测试环境中执行一次无害的读取操作,并检查生成的消息。检查该工具是否按照合同要求保留了可选字段、命名空间限定、枚举类型以及数值精度。

变更管理应从一开始就纳入 REST API 与 SOAP API 的评估范畴。需明确:谁负责发布破坏性变更公告、旧版消费者将获得多长时间的支持,以及在正式发布前是否提供测试用例。新增字段仍可能导致拒绝未知数据的消费者出现故障;重命名后的字段在忽略该字段的消费者中可能会悄然消失。

对于新服务,应选择明确的兼容性规则,并使用具有代表性的客户端进行测试。对于现有服务提供方,应将外部契约细节隔离在适配器中,以确保数据处理管道的其余部分不依赖于生成的类名或原始响应布局。这种边界划分即使协议保持不变,也能使后续迁移的范围更小。

将安全性视为部署后的行为进行评估

这两种接口风格本身均无法提供应用程序授权。负责验证您账户的服务仍需决定您是否可以读取所请求的产品、修改订单或检索其他客户的报告。请使用提供商支持的测试身份和允许的场景来测试这些决策。

将传输保护与消息保护区分开来。TLS 保护其端点之间的连接。在包含网关和中间节点的系统中,需确定这些连接的终止点以及哪些组件可以读取有效载荷。然后决定消息本身是否需要超越单个传输连接的持续保护。

SOAP 部署可使用 WS-Security 实现消息级机制,例如安全令牌、签名和加密。这些是必须单独选择并实现的附加要求;它们不会因 XML 封装而自动启用。OASIS SOAP 消息安全规范定义了该框架。

在对比 REST API 与 SOAP API 时,应明确询问具体支持的安全配置文件,而非仅接受“企业级安全”这类笼统表述。需确定凭证的签发方、有效期、签名密钥的存储位置,以及服务器如何处理无法验证的消息。请结合团队现有的身份识别和运营系统来确认这些细节。

解析环节也值得关注。应将外部 XML 和 JSON 视为不可信输入,强制执行合理的大小限制,并根据所选库的安全指南配置解析器。当请求或响应正文包含凭证或客户信息时,应避免将其写入通用日志。仅凭协议标签并不能保证解析器配置的安全性。

浏览器行为是集成中的一个独立层。如果某个端点依赖于已登录的浏览器会话,请明确记录该要求。了解 HTTP Cookie 的作用域和会话处理机制,有助于解释为何即使服务器端客户端和浏览器访问同一 URL,它们收到的响应也可能不同。

根据工作负载衡量性能和可缓存性

XML 封装体可能包含比紧凑的 JSON 文档更多的结构化文本,但这一观察结果不能作为延迟的基准。总时间包括连接建立、身份验证、应用程序处理、序列化、传输和客户端解析。缓慢的数据库查询可能会主导任一种实现方式的性能。

在宣布 REST API 与 SOAP API 孰优孰劣之前,应构建一个具有代表性的读取场景。确保请求数据、网络路径、并发性及预热条件具有可比性。将传输字节数和客户端解析与端到端延迟分开测量。报告实际配置,以便同事能够复现该结果。

缓存是另一个容易被口号误导的领域。HTTP 缓存取决于方法语义、状态码、数据新鲜度、验证器以及适用的请求和响应字段。RFC 9111 定义了这些规则。一个冠以 REST 之名的端点可能会刻意禁止缓存;仅凭协议名称并不能保证响应内容安全可复用。

对于供应商产品目录,需区分产品描述与库存数据。即使它们出现在同一文档中,其可接受的有效期也可能不同。需确定消费者是否每次都需要最新数据、能否重新验证已保存的表示形式,还是可以在文档规定的有效期内重复使用数据。

在部署的集成中,SOAP 查询操作通常使用 HTTP POST,因此不要假设常规的共享 HTTP 缓存会像缓存可 GET 表示一样复用其响应。也不应断定 SOAP 禁止任何形式的缓存。应用层缓存是一种独立的设计,拥有其自身的键、失效规则和正确性义务。

请在编写数据契约的同时制定缓存契约。其中应包含账户和区域边界、检索时间戳,以及重新验证失败时的处理行为。即使基准测试数据再理想,若响应速度再快,但若返回了错误客户的数据或掩盖了不可接受的数据过时问题,都属于集成失败。

在启用重试之前先设计恢复机制

最棘手的故障是结果不确定。客户端发送订单请求,供应商进行处理,但在响应到达前连接中断。重复请求可能会生成第二份订单;放弃请求则可能导致系统误以为不存在任何订单。

REST API 与 SOAP API 本身并不能解决这一问题。你需要制定操作级别的恢复协议:一种幂等机制、一个可供查询的稳定业务参考,或者其他已记录的对账路径。切勿仅因 SDK 提供了重试选项,就推断其具备防重复功能。

对于 HTTP,安全且幂等的请求方法语义有助于引导自动化行为,但其含义非常精确。幂等性关注的是重复相同请求的预期效果,而非响应正文是否相同,也不是对“仅执行一次”的承诺。RFC 9110 定义了这些语义,并讨论了重试方面的注意事项。

SOAP 故障会提供结构化的错误信息,但它并非关于下游业务操作是否发生的通用声明。同样,HTTP 错误状态也需要结合操作上下文进行解读。应仔细检查已记录的故障类别、业务错误字段和关联信息,而不是对每个失败都应用同一套重试策略。

某些 SOAP 部署会添加可靠消息传递规范或其他协调功能。必须明确确认所选的绑定和服务支持所需的行为。切勿将交付保证、分布式事务或应用程序重复数据防止功能归因于 SOAP 核心。

对于只读收集器,一种有效的恢复设计应记录最后接受的页面或项,并在继续处理前验证响应。限制重试次数,保持清晰的最终失败状态,并将传输错误与有效的空结果区分开来。若使用 Python 实现收集器,请比较不同的 Python HTTP 客户端,以确定集成实际所需的控制功能,例如超时和连接复用。

基于简要决策记录进行选择

对于现有提供商,可用的合同通常会限制选择范围。如果供应商仅支持 SOAP 来执行所需操作,那么偏好 JSON 也无法提供替代方案。请评估支持的工具链,隔离适配器,并决定该服务是否满足您的要求。

对于新接口,需对比实际消费者的需求。一个具备资源导航和可复用读取功能的公共目录,与一个已经要求特定消息安全配置文件的合作伙伴工作流相比,会带来不同的压力。当 REST API 与 SOAP API 的对比能明确揭示这些压力时,这种对比就很有用。

情况

应指导选择的依据

现有供应商集成

支持的端点、合同版本、测试访问权限以及受维护的客户端工具

读取密集型目录

数据时效性要求、验证规则、分页控制及缓存策略

合作伙伴消息工作流

必需的消息格式、安全配置文件及互操作性测试

订单提交

重复数据预防、数据核对及不确定结果处理

计划迁移

行为一致性、客户端兼容性及分阶段回滚

记录所选接口、已验证的假设以及未解决的依赖关系。添加一项被否决的选项并附上具体理由,例如缺少对供应商所需配置文件的支持。确保记录简明扼要,以便值班工程师在故障发生时能够使用。

若您后续在 SOAP 服务前添加了 HTTP 门面,请将其视为具有独立测试的转换边界。将 XML 映射到 JSON 并不会自动保留故障语义、事务或兼容性,也不会自动生成 REST 架构。在将该门面作为等效替代方案推出之前,请先验证其行为。

关键要点

  • 在评估 REST API 与 SOAP API 时,应以提供方的实际契约为起点:REST 是一种架构风格,而 SOAP 定义的是消息传递框架。
  • 在根据示例有效载荷估算实现工作量之前,应先检查所需的模式、绑定、客户端工具和兼容性策略。
  • 应分别验证传输保护、消息安全要求和应用程序授权;这两种标签均不能作为安全保证。
  • 在宣称性能或缓存优势之前,应测量具有代表性的请求并定义可接受的数据过时度。
  • 针对不确定的结果应要求制定恢复协议,特别是在重复操作可能导致业务工作重复的情况下。

常见问题

一个应用程序能否同时暴露这两个接口?

可以。一个应用程序可以通过共享的业务功能提供多个接口。每个接口仍需要明确的契约、错误映射和兼容性策略。针对相同的预期业务结果测试等效操作,并避免让一个接口绕过另一个接口所强制执行的验证或授权检查。

选择 SOAP 是否需要特定的编程语言?

不需要。SOAP 定义的是消息传递行为,而非强制要求的应用程序语言。实际的限制在于,您技术栈中维护的库是否支持提供商确切的服务描述、绑定和扩展。请使用提供商的构建产物来评估这种支持,而不是假设基本的 XML 支持就足够了。

GraphQL 是 REST 的别称吗?

不是。GraphQL 描述的是另一种查询和执行模型。其可用性并不能解决现有 SOAP 服务与 REST 导向接口之间的比较问题。如果您正在将其作为额外选项进行评估,请围绕相同的消费者需求和运营限制编写独立的比较分析,而非将其视为一种格式转换。

选择能够可靠运行的接口

REST API 与 SOAP API 对比的有用结果是制定集成计划。您应了解消息的含义、客户端如何获取契约、需要哪些安全机制,以及收到不确定响应后会发生什么。熟悉的有效载荷格式虽有帮助,但这仅是该计划的一部分。

对于供应商集成,请围绕经过验证的交互和领域结果构建一个小型适配器。确保请求上下文和诊断标识符可用,保留外部错误的含义,并在增加流量前测试恢复机制。对于新服务,请记录相同的行为,以便消费者无需反向工程您的实现即可做出明智的选择。

当所需信息无法通过受支持的提供商 API 获取,而只能通过网页获取时,可将 WebScrapingAPI 的 Scraper API 作为独立的数据采集途径进行评估。确保提取的数据遵循明确的内部契约,以便下游管道能够通过明确的验证和来源追溯来处理 API 记录和网页观察结果。

关于作者

Gabriel Cioci, 全栈开发工程师 @ WebScrapingAPI

Gabriel Cioci

全栈开发工程师

加布里埃尔·乔奇(Gabriel Cioci)是 WebScrapingAPI 的全栈开发工程师,负责构建和维护该平台的网站、用户面板以及面向用户的核心功能模块。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。