REST和SOAP协议有什么区别?
REST和SOAP协议有什么区别?
REST和SOAP是两种广泛使用的网络API规范,它们在设计哲学、数据格式、传输协议等方面存在显著差异。本文将深入探讨这两种标准之间的区别,并分析它们在不同场景下的适用性。
API是应用程序编程接口(Application Programming Interface)的缩写。API规定了不同的软件组件应如何以编程方式进行交互和通信。
最常见的API类型就是Web API。网络应用(包括网站)向Web API或网络服务发送请求,要求向用户显示数据。例如,一个网站会根据你的搜索条件,返回航班、酒店或租车的最优惠信息。网站不会从它的数据库中检索这些数据,而是通过向专门提供航班、酒店等服务的API发送请求来获取数据的。Web API就是使用HTTP协议传输数据的API。
目前最流行的两种网络API规范是REST和SOAP。关于哪种架构风格最适合构建API,目前还存在争议。它们虽然都是规范,但却不能把它们相提并论,有一个微妙的区别在于,REST是一种API架构风格,而SOAP则是一种访问网络服务的协议。它们看似相互竞争,但两者都有各自的使用场景。
本文将探讨这两种标准之间的差异,以及两种协议该如何选择。
REST和SOAP的异同
REST和SOAP之间的共同点是什么,为什么它们经常被拿来比较?
REST和SOAP都是规范,为客户如何访问网络服务、与网络服务交互以及它们所暴露的功能提供了标准。如前文所述,REST是一种API架构风格,而SOAP是一种数据传输协议。
- REST作为一种架构风格,对Web API的设计有一定的限制。REST标准要求被视为“RESTful”的Web API必须遵守REST约束。这些约束包括客户端与API服务器分离、无状态和可缓存性等等。
- SOAP作为Web API协议,是一种数据传输的标准,它规定了消息的:
- 格式
- 通信协议
- 处理方式。与SOAP不同,REST并不规定如何处理API信息
由于SOAP只是一种Web API协议,因此REST API可以使用SOAP协议作为数据传输的标准。不过,REST和SOAP是不同的标准,一般不能混用。
虽然一个是架构,一个是协议,但两者都为API消息格式提供了标准。REST和SOAP的信息格式可由人类和机器读取。对于REST而言,JSON是一种轻量级数据交换格式,与浏览器高度兼容。对于SOAP而言,XML是一种可扩展的标记语言,允许自定义描述性标记,便于阅读。稍后将详细讨论这些数据格式。
在REST之前的SOAP
SOAP出现在REST之前。REST的设计旨在解决SOAP的一些问题。REST的目标是轻量级、与浏览器高度兼容、将客户端与服务器分离并提供缓存功能。
那么,如果REST出现在SOAP之后,并且REST解决了SOAP的问题,为什么SOAP还存在呢?
这是因为虽然REST比SOAP有明显的优势,而且在某些方面来说,REST的目的是要取代SOAP,但SOAP也依然有它的用武之处。例如SOAP适合需要消息级安全性的企业级应用。
什么是REST API?
REST是“表征性状态传输”(Representational State Transfer)的缩写,是一种特定的API构建风格,通过这种风格进行约束的API被认为是RESTful API。RESTful API必须满足以下要求:
- 统一的接口
- 无状态
- 可缓存
- 客户端与服务器分离
- 分层系统
- 按需编码
REST API是使用HTTP协议的Web API,其中客户端向API服务器发送HTTP数据请求,然后服务端将带有编码数据的HTTP响应返回客户端。
客户端使用“资源”访问和操作REST API公开的数据。资源代表不同的API功能,并通过资源URL对其进行访问。可以将资源视为API返回的数据对象。在发送请求时,你会向资源传递一个与CRUD(创建、读取、更新和删除)操作相对应的方法。将方法视为对资源采取的“操作”,例如创建、更新或删除资源。
例如,众所周知的Swagger Petstore API由多个资源组成。这些资源包括宠物、商店和用户。所有资源都与宠物店这一主题有关,每个资源都代表了你可以创建、操作或删除的不同数据对象。
要请求一个资源,你需要向该资源的唯一URL发送HTTP请求,并指定要对该资源采取的操作(方法)。示例操作包括创建、更新、查询或删除资源(分别为POST、PUT、GET和DEL)。
REST API的优点
前后端分离
前后端分离具有以下优点:
- 所有组件的可迁移性。由于REST架构是“多层次的”,所以服务器组件具有可迁移性。REST API可在多个平台上使用,这可以在开发过程中轻松进行测试。
- 通过限制架构层之间的交互(多层次架构),提高了可扩展性。这种限制简化了服务器组件。这种架构还提高了在服务器之间迁移数据的灵活性,并且可以迅速推出新的更改。
- 更易集成。REST使开发人员能够更多地关注用户界面、功能和业务规则,而不是由API服务器处理的服务器组件和数据管理。
支持JSON消息格式
REST使用JSON作为数据格式有几个优点:
- 浏览器兼容性:JSON作为一种数据格式,与浏览器非常兼容,对浏览器更友好。
- 占用带宽少:JSON是一种极其轻量级且易于解析的数据格式。XML有效载荷(就SOAP而言)比JSON大。较大的有效载荷需要更多带宽。编写XML SOAP请求所需的代码量也会增加信息的大小。
信息格式的灵活性
除了JSON之外,REST还提供更多信息格式,如HTML、纯文本、XML、YAML等。消息格式的灵活性使REST更适用于公共API。
什么是SOAP?
XML允许使用自定义的描述性标签来存储和共享信息,这与HTML使用的预定义标签不同。XML的标准化特性使其能够在不同平台和系统间轻松迁移。作为一种消息格式,XML提供了很高的灵活性,用户可以根据需求定义XML模式,以确保XML消息的结构满足特定要求。
在数据访问和操作方式上,SOAP API与REST API有所区别。REST API通过资源URL来访问数据,而SOAP API则是通过调用特定的API函数来操作数据。
与REST不同,SOAP请求中并不直接包含CRUD(创建、读取、更新、删除)操作。相反,这些操作是通过调用不同的函数来实现的。例如,在REST API中,通常只需一个URL端点,通过发送POST或PUT请求即可完成资源的创建或更新。而在SOAP中,创建或更新数据对象需要分别调用处理这些特定操作的独立函数。
XML消息主要通过HTTP或HTTPS协议进行传输。但值得注意的是,SOAP API还支持其他传输协议,如传输控制协议(TCP)、简单邮件传输协议(SMTP)和用户数据报协议(UDP)。相比之下,REST API则仅限于使用HTTP协议。
SOAP的优势
更强的安全性
SOAP非常适合注重安全的网络服务,因为它使用WS-Security(以及SSL)和内置ACID合规性。REST则不具备这些功能。WS-Security是关于对SOAP XML消息进行签名和加密的规范。每个SOAP请求的标题块都包含完成请求所需的安全信息。ACID合规性是一套保护数据库完整性的标准。许多企业级和金融交易应用程序都需要ACID合规性。
灵活的传输渠道
SOAP支持多种通信协议。REST仅支持HTTP。使用SOAP,你可以使用HTTP、HTTPS、用户数据协议(UDP)、传输控制协议(TCP)或简单邮件传输协议(SMTP)。
REST剖析
REST API由以下部分组成:
- 请求方法:希望对资源执行的CRUD操作。在本例中,HTTP方法POST表示希望创建某个内容。
- 端点:资源的特定端点(资源URL)。在本例中,端点是https://petstore.swagger.io/v2/pet。资源是API返回的数据对象,可使用端点进行定位。
- 请求头:指定信息格式,本例中为JSON格式。你可以在请求头中传递授权租户(如API密钥)。
- 请求体:包含一个JSON对象,其中包含新资源的属性。在本例中,请求体包含新宠物的详细信息。请求体与参数类似,只是它们是包含多个属性的对象,而不是一个。
下面是向Swagger Petstore API发出的创建宠物的REST API cURL请求:
SOAP剖析
SOAP XML消息包含以下几个“块”:
- Envelope(信封):必需的部分,用于标识该XML消息为SOAP消息(与其他XML消息不同)。其namespace属性指向SOAP的最新版本。
- Header(请求头):可选的部分,用于存储授权属性,如API密钥等。
- Body(主体):必需的部分,用于指定在提交请求后期望从API接收哪些信息返回。此部分包括函数名(过程)和你希望传递的参数,这些将影响结果。在响应中,Body部分包含API的响应以及所请求的信息。
- Fault(错误):可选的部分。如果SOAP API无法处理请求,它将发送在此处定义的错误消息。请求失败的原因有很多,例如,消息结构可能不符合XML模式定义。
为了理解SOAP的结构,让我们比较一下REST消息和SOAP消息。下面是向Swagger Petstore API发出的REST API cURL请求,该请求根据petId检索宠物。
petId 1是一个路径参数,放在请求的资源URL末尾。
下面是相同请求的SOAP结构,以展示它们的差异:
以下是它们的不同点:
- 信息格式:
- REST - cURL是用于构建HTTP请求的工具,但你也可以使用多种编程语言来发送REST请求。这些请求的消息负载(即消息正文)通常采用JSON格式。
- SOAP - 信息格式为XML。XML结构由XML架构执行。
- 请求方法(CRUD操作):
- REST - 在请求中提供GET方法,告诉应用程序接口检索某些内容。
- SOAP - 请求中不提供方法。请求会被发送到一个处理检索的过程(GetPet函数)。
- 参数:
- REST - 宠物ID作为路径参数传递给端点URL。
- SOAP - 使用GetPet选项在Body块中传递宠物ID。
何时使用REST与SOAP
REST适用于公开Web服务
REST因其使用JSON作为消息格式而非常适合公开Web服务和开放API。JSON的轻便、小巧以及与浏览器的高度兼容性,都使其相较于SOAP的XML格式更具优势。此外,SOAP的XML消息较为冗长,而JSON则更加简洁。
在处理SOAP XML消息时,由于其组成的复杂性,通常需要在编程语言中集成SOAP库进行API调用,这相对增加了抽象层和处理开销。与此相反,REST倡导的前后端分离的原则不依赖于客户端库,从而保持了网络服务的可迁移性、可扩展性和独立发展性。
在资源受限的网络服务环境中,REST的优势还在于客户端可以有效地缓存HTTP响应。这是通过REST使用URL分离端点并利用HTTP请求头执行CRUD操作实现的,而SOAP则因其POST请求方式而难以实现缓存。
企业级应用更倾向SOAP
尽管REST在公开网络服务中表现出色,但SOAP在安全关键型应用中更具优势,这得益于其内置的消息级WS安全性。这种附加的安全性,使得SOAP更适合用于企业级软件,如客户关系管理、身份认证、银行应用、金融和电信服务,以及与传统系统的集成。
此外,SOAP还内置了ACID合规性,这一点对于敏感的金融服务尤其具有吸引力。因此,在企业级应用中,SOAP往往因其强大的安全性和事务处理能力而备受青睐。
除了SOAP和REST之外的其他选择
除了SOAP和REST,还有其他一些常见的选择,如gRPC和GraphQL。
gRPC这个标准非常适合需要在带宽受限的情况下进行轻量级消息传递的微服务架构。你可以使用gRPC将智能手机等物联网设备与后端服务连接起来。
GraphQL是一种越来越受欢迎的数据库查询语言。从GraphQL API请求数据比使用REST更高效。使用REST时,有单独的资源URL(有时多达数百个)来暴露API的功能。如果你需要从两个资源中收集信息,你必须向每个资源URL发出请求。而使用GraphQL,所有API数据都可以通过一次查询请求获取。客户端使用过滤器缩小查询范围,从而从一个API中检索数据。
总结
REST和SOAP都是为客户端访问和与Web服务交互以及其暴露的功能提供标准的规范。然而,REST是一种API架构风格,而SOAP是客户端与Web服务器之间的数据传输协议。因此,将两者进行比较并不完全对等。
REST的出现是为了改善SOAP的局限。REST的优势使其非常适合资源受限的公开Web服务。REST的数据格式JSON与浏览器高度兼容,并且比SOAP的XML有效载荷所需的带宽更少。REST还强制要求前后端的分离。这一约束对于网络服务的高效运行至关重要。虽然REST在某些方面已经取代了SOAP在公共网络服务中的地位,但SOAP在安全敏感的场景中,如企业级应用和金融服务中,仍然有着很高的采用率。