SOAP与REST(差异)


1239

我已经阅读了有关SOAP和REST作为Web服务通信协议之间差异的文章,但是我认为REST相对于SOAP的最大优势在于:

  1. REST更动态,无需创建和更新UDDI(通用描述,发现和集成)。

  2. REST不仅限于XML格式。RESTful Web服务可以发送纯文本/ JSON / XML。

但是SOAP更加标准化(例如:安全性)。

那么,我在这些方面是否正确?


180
关于SOAP vs REST,我非常喜欢一个字母类推,使用SOAP时您使用信封,使用REST时则是明信片,因此SOAP显然有一些额外的开销:更多的带宽(更多的纸张),双方的额外工作(包装和展开)。但这并不意味着REST不如SOAP那样安全,因为您可以使用HTTPS(将其视为用只会说外语的人代替邮递员)
watashiSHUN 2016年




4
根据将REST方法的主要元素分为三个步骤的Richardson Maturity Model,SOAP是0级REST。
Sampada

Answers:


1754

不幸的是,关于REST有很多误解和误解。@cmd不仅反映您的问题和答案,而且反映与Stack Overflow上的主题相关的大多数问题和答案。

SOAP和REST无法直接进行比较,因为第一个是协议(或至少是协议),第二个是体系结构样式。这可能是引起混乱的根源之一,因为人们倾向于将REST以外的任何HTTP API称为SOAP。

稍作努力并尝试建立比较,SOAP和REST之间的主要区别在于客户端和服务器实现之间的耦合程度。SOAP客户端的工作方式类似于自定义桌面应用程序,与服务器紧密耦合。客户端和服务器之间存在严格的合同,如果任何一方更改任何内容,一切都会中断。在进行任何更改后,您需要不断更新,但更容易确定是否遵守合同。

REST客户端更像是浏览器。这是一个通用客户端,知道如何使用协议和标准化方法,并且应用程序必须适合其中。您不会通过创建其他方法来违反协议标准,而是可以使用标准方法并在您的媒体类型上使用它们来创建操作。如果做得正确,耦合度就会降低,并且可以更优雅地处理更改。除了入口点和媒体类型之外,客户端应该以对API零知识的方式进入REST服务。在SOAP中,客户端需要有关将要使用的所有内容的先前知识,或者甚至不会开始交互。此外,REST客户端可以通过服务器本身提供的按需代码进行扩展,

我认为这些是了解REST的意义以及与SOAP有何不同的关键点:

  • REST与协议无关。它没有耦合到HTTP。就像您可以在网站上跟随ftp链接一样,REST应用程序可以使用具有标准化URI方案的任何协议。

  • REST不是CRUD到HTTP方法的映射。阅读答案以获取有关此内容的详细说明。

  • REST与您使用的部件一样标准化。HTTP中的安全性和身份验证是标准化的,因此这就是在HTTP上进行REST时使用的方式。

  • 没有超媒体HATEOAS的 REST就不是REST 。这意味着客户端仅知道入口点URI,并且资源应返回客户端应遵循的链接。这些花哨的文档生成器为您在REST API中可以执行的所有操作提供URI模式,这完全忽略了这一点。他们不仅在记录本应遵循该标准的内容,而且在执行此操作时,您将客户端与API演进中的特定时刻联系在一起,并且必须记录和应用API的任何更改,否则会破裂。

  • REST是Web本身的体系结构样式。当您输入Stack Overflow时,您知道什么是用户,问题和答案,媒体类型,并且网站为您提供了指向它们的链接。REST API必须执行相同的操作。如果我们以人们认为REST的方式设计网络,而不是使用带有指向“问答”链接的主页,则将有一个静态文档来说明,为了查看问题,您必须使用URI stackoverflow.com/questions/<id>,将ID替换为Question.id,然后将其粘贴到浏览器中。那是胡扯,但这就是许多人认为REST的含义。

最后一点不能足够强调。如果您的客户是从文档中的模板构建URI,而未在资源表示中获得链接,则不是REST。REST的作者Roy Fielding在此博客文章中明确指出:REST API必须是超文本驱动的

考虑到以上几点,您将认识到,尽管REST可能不限于XML,但要正确地使用其他任何格式,则必须为链接设计和标准化某种格式。超链接是XML的标准配置,但不是JSON的标准配置。有JSON的标准草案,例如HAL

最后,REST并不适合所有人,这证明了大多数人如何使用错误地称为REST的HTTP API很好地解决他们的问题,并且永不冒险。REST有时很难做到,尤其是在开始时,但是随着时间的流逝,它会在服务器端更轻松地演进以及客户对变更的适应力中付出代价。如果您需要快速,轻松地完成某件事,请不要担心正确使用REST。可能不是您要找的东西。如果您需要一些必须保持在线状态长达数年甚至数十年的信息,那么REST就适合您。


8
两者都可以。问题在于用户如何获取URL,而不是他们如何使用它们。他们应该从其他文档中的链接而不是文档中获取搜索网址。该文档可能会解释如何使用搜索资源。
Pedro Werneck 2014年

2
@CristiPotlog我从未说过SOAP依赖于任何特定协议,我只是强调REST并非如此。您发送的第二个链接说REST需要HTTP,这是错误的。
Pedro Werneck 2015年

4
让我们再重复一遍:如果您想调用API Restful,则HATEOAS是一个约束
Orestis

3
@SachinKainth有一个答案在这里。您可以将CRUD op映射到HTTP方法,但这不是REST,因为这不是RFC中记录的那些方法的预期语义。
Pedro Werneck'Mar

3
最后4行是宝石,开发人员应充分理解。做纯正的休息很费时,但是从长远来看会带来回报。因此对于中型或大型项目更好。不适合用于原型设计和小型项目。
Rajan Chauhan

287

RESTVS SOAP不是要问正确的问题。

REST不像SOAP不是一个协议。

REST是一种基于网络的软件体系结构的体系结构样式设计

REST概念称为资源。资源的表示形式必须是无状态的。它通过某种媒体类型表示。媒体类型的一些例子包括XMLJSON,和RDF。资源由组件操纵。组件通过标准的统一接口请求和操纵资源。在HTTP的情况下,该接口由标准HTTP OPS例如GETPUTPOSTDELETE

@Abdulaziz的问题确实说明了事实,REST并且HTTP经常串联使用。这主要是由于HTTP的简单性及其对RESTful原理的非常自然的映射。

REST基本原理

客户端-服务器通信

客户端-服务器体系结构的关注点非常不同。原则上,以RESTful样式构建的所有应用程序也必须是客户端服务器。

无状态

每个对服务器的客户端请求都要求完全表示其状态。服务器必须能够完全理解客户端请求,而无需使用任何服务器上下文或服务器会话状态。因此,所有状态都必须保留在客户端上。

可缓存的

可以使用缓存约束,从而使响应数据可以标记为可缓存或不可缓存。任何标记为可缓存的数据都可以重用作为对相同后续请求的响应。

统一界面

所有组件都必须通过一个统一的界面进行交互。因为所有组件交互都是通过此接口发生的,所以与不同服务的交互非常简单。界面是一样的!这也意味着可以单独进行实现更改。这样的更改不会影响基本组件的交互,因为统一接口始终不变。一个缺点是您被接口卡住了。如果可以通过更改接口来为特定服务提供优化,则您很不走运,因为REST禁止这样做。从好的方面来说,REST是针对Web优化的,因此REST在HTTP上的普及程度令人难以置信!

以上概念代表了REST的定义特征,并将REST体系结构与其他体系结构(如Web服务)区分开来。值得注意的是,REST服务是Web服务,但是Web服务不一定是REST服务。

有关REST和上述项目符号的更多详细信息,请参见有关REST设计原则的博客文章

编辑:根据评论更新内容


7
REST没有一组预定义的操作,即CRUD操作。将HTTP方法盲目映射到CRUD操作是围绕REST的最常见误解之一。HTTP方法具有定义良好的行为,与CRUD无关,并且REST未与HTTP耦合。例如,您可以在ftp上拥有一个REST API,仅保留RETR和STOR。
Pedro Werneck

10
另外,“ REST服务是幂等的”是什么意思?据我所知,您有一些默认情况下是幂等的HTTP方法,如果服务中的特定操作需要幂等,则应该使用它们,但是说服务是幂等的没有道理。该服务可以具有资源,该资源具有可以以等幂或非等幂方式实现的动作。
Pedro Werneck

2
@cmd:请删除第四点-“ RESTful体系结构可以使用HTTP或SOAP作为基础通信协议”。这是您传达的错误信息。
Bruce_Wayne 2015年

236

SOAP(简单对象访问协议)和REST(表示状态传输)两者的方式都很漂亮。所以我没有比较它们。相反,当我更喜欢使用REST和SOAP时,我试图描绘出这张图。

什么是有效载荷?

当数据通过Internet发送时,每个发送的单元都包括标头信息和实际发送的数据。标头标识数据包的源和目的地,而实际数据称为有效负载。通常,有效负载是代表应用程序承载的数据和目标系统接收的数据。

例如,现在我必须发送电报,我们都知道电报的费用将取决于某些单词。

因此,在下面提到的这两个消息中告诉我,哪个消息发送起来便宜些?

<name>Arin</name>

要么

"name": "Arin"

我知道您的答案将是第二个答案,尽管第二个都表示相同的消息,但就成本而言更便宜。

因此,我想说的是,就有效负载而言,以JSON格式通过网络发送数据比以XML格式发送数据便宜

这是REST相对于SOAP的第一个优点或优点。SOAP仅支持XML,但是REST支持不同的格式,例如文本,JSON,XML等。并且我们已经知道,如果使用Json,那么在有效负载方面肯定会处于更好的位置。

现在,SOAP支持唯一的XML,但是它也有其优势。

真!怎么样?

SOAP通过三种方式依赖XML信封-定义消息中包含的内容以及如何对其进行处理。

一组用于数据类型的编码规则,最后是过程调用和响应的布局。

该信封通过传输(HTTP / HTTPS)发送,并执行RPC(远程过程调用),并且信封以XML格式的文档中的信息返回。

重要的一点是,SOAP的优点之一是使用“通用”传输,REST使用HTTP / HTTPS。SOAP几乎可以使用任何传输方式发送请求,而REST不能。因此,这里我们有了使用SOAP的优势。

正如我在上一段“ REST使用HTTP / HTTPS”中已经提到的那样,请对这些词进行更深入的介绍。

当我们谈论基于HTTP的REST时,将继承所有应用HTTP的安全措施,这就是所谓的传输级安全性,它仅在消息处于线内时保护消息,但是一旦在另一端传递消息,您就不知道在到达将要处理数据的实际点之前,它必须经历多少个阶段。当然,所有这些阶段都可以使用与HTTP不同的东西。因此,休息并不完全安全,对吗?

但是SOAP 像REST一样支持SSL ,它还支持WS-Security,它增加了一些企业安全性功能。WS-Security提供了从创建消息到使用消息的保护。因此,对于传输级安全性,我们发现可以使用WS-Security避免的任何漏洞。

除此之外,由于REST受其HTTP协议的限制,因此它的事务支持既不符合ACID,也不能跨分布式跨国资源提供两阶段提交。

但是SOAP全面支持短期交易的基于ACID的交易管理和长期交易的基于补偿的交易管理。它还支持跨分布式资源的两阶段提交

我没有得出任何结论,但是我将更喜欢基于SOAP的Web服务,而安全,事务等是主要关注点。

在这里的“ Java EE 6教程”中,当满足以下条件时,他们说RESTful设计可能是合适的。看一看。

希望您喜欢阅读我的回答。


15
很好的答案,但请记住REST可以使用任何传输协议。例如,它可以使用FTP。
Bhargav Nanekalva 2015年

11
谁说REST无法使用SSL?
Osama Aftab

1
@ Osama Aftab REST支持SSL,但是SOAP 与REST一样支持SSL,此外它还支持WS-Security。
Bacteria

3
为了参考有关XML数据大小的要点,启用压缩后,XML很小。
GaTechThomas,2016年

2
关于有效负载大小的要点应该删除,它是JSON和XML之间的一维比较,并且只有在非常优化的设置中才能检测到,而两者之间的距离很远。
ThomasRS

126

RESTRE表象小号大老牛逼转让(BOT))
RE表象小号大老对象是牛逼 ransferred是REST,即我们不会发送对象,我们发送对象的状态。REST是一种建筑风格。它没有定义很多标准,例如SOAP。REST用于通过互联网公开公共API(即Facebook API,Google Maps API)以处理数据的CRUD操作。REST专注于通过单个一致的接口访问命名资源。

SOAPš imple ö bject CCESS P rotocol)
SOAP带来它自己的协议,并集中在暴露的应用程序逻辑(未数据)的块作为服务。SOAP公开操作。SOAP专注于访问命名操作,每个操作实现一些业务逻辑。尽管SOAP通常被称为Web服务,但这是错误的称呼。SOAP与Web几乎没有关系。REST提供基于URI和HTTP的真正的Web服务

为什么要REST?

  • 由于REST使用标准的HTTP,因此它几乎在所有方面都更加简单。
  • REST更易于实现,需要更少的带宽和资源。
  • REST允许许多不同的数据格式,而SOAP仅允许XML。
  • REST由于支持JSON,因此可以更好地支持浏览器客户端。
  • REST具有更好的性能和可伸缩性。可以缓存REST读取,不能缓存基于SOAP的读取。
  • 如果安全不是主要问题,并且我们的资源有限。或者,我们想创建一个可供其他开发者公开使用的API,那么我们应该使用REST。
  • 如果我们需要无状态CRUD操作,请使用REST。
  • REST通常用于社交媒体,网络聊天,移动服务和Google Maps等公共API。
  • RESTful服务针对同一资源返回各种MediaType,具体取决于请求标头参数“接受”(对于POST application/xmlapplication/json对于/user/1234.jsonGET而言,/user/1234.xml对于GET对于GET)。
  • REST服务应由客户端应用程序而不是最终用户直接调用。
  • ST在其余的来自小号大老牛逼转让(BOT)。您转移状态而不是由服务器存储状态,这使REST服务具有可伸缩性。

为什么要使用SOAP?

  • SOAP并不是很容易实现,并且需要更多的带宽和资源。
  • 与REST相比,处理SOAP消息请求的速度较慢,并且不使用Web缓存机制。
  • WS-Security:尽管SOAP支持SSL(就像REST一样),但它也支持WS-Security,它增加了一些企业安全性功能。
  • WS-AtomicTransaction:在服务上需要ACID事务,您将需要SOAP。
  • WS-ReliableMessaging:如果您的应用程序需要异步处理以及有保证的可靠性和安全性。Rest没有标准的消息传递系统,希望客户端通过重试来处理通信失败。
  • 如果安全是主要问题,并且资源没有限制,那么我们应该使用SOAP Web服务。就像我们要创建用于支付网关,金融和电信相关工作的Web服务一样,我们应该使用SOAP,因为这里需要很高的安全性。

在此处输入图片说明

源1
源2


REST动词/方法与CRUD方法没有1对1的关系,但是它可以帮助您一开始就了解REST风格。
圣地亚哥·马丁·奥尔布里希,

5
REST不支持SSL?其余的统一资源网址不能以https://开头吗?
谅解

50

休息和肥皂之间的区别

肥皂

  1. SOAP是一种协议。
  2. SOAP代表简单对象访问协议。
  3. SOAP无法使用REST,因为它是一个协议。
  4. SOAP使用服务接口来公开业务逻辑。
  5. SOAP定义了必须严格遵循的标准。
  6. SOAP比REST需要更多的带宽和资源。
  7. SOAP定义了自己的安全性。
  8. SOAP仅允许XML数据格式。
  9. SOAP不如REST优先。

休息

  1. REST是一种建筑风格。
  2. REST代表代表性状态转移。
  3. REST可以使用SOAP Web服务,因为它是一个概念,可以使用HTTP,SOAP等任何协议。
  4. REST使用URI公开业务逻辑。
  5. REST没有定义太多的标准,例如SOAP。
  6. REST比SOAP需要更少的带宽和资源。
  7. RESTful Web服务从基础传输继承安全措施。
  8. REST允许使用不同的数据格式,例如纯文本,HTML,XML,JSON等。
  9. REST比SOAP更可取。

有关更多详细信息,请参见此处


REST下的3和6是否不矛盾?
Drazen Bjelovuk

我们只是比较彼此的功能。
Rex

20

恕我直言,您无法比较SOAP和REST,因为两者是两个不同的地方。

SOAP是一种协议,REST是一种软件体系结构模式。互联网上对于SOAP与REST有很多误解。

SOAP定义了基于XML的消息格式,支持Web服务的应用程序使用该消息格式通过Internet相互通信。为了做到这一点,应用程序需要先了解消息约定,数据类型等。

REST通过URL表示服务器的状态(作为资源),它是无状态的,并且客户端不应该具有对超媒体的了解,与服务器进行交互的先验知识。


14

首先:正式,正确的问题将是web services + WSDL + SOAPVS REST

因为尽管松散地使用了Web服务,但是当使用HTTP协议而不是网页传输数据时正式地说,这是该思想的一种非常具体的形式。根据定义,REST不是“ Web服务”。

但是实际上,每个人都忽略了这一点,所以我们也忽略它

已经有了技术上的答案,因此我将尝试提供一些直觉。

假设您要在远程计算机上调用以其他编程语言实现的函数(通常称为远程过程调用/ RPC)。假定可以在编写者提供的特定URL上找到该函数。您必须(以某种方式)向其发送消息,并获得一些响应。因此,有两个主要问题需要考虑。

  • 您应该发送的消息格式是什么
  • 消息应该如何来回传递

对于第一个问题,正式定义是WSDL。这是一个XML文件,以详细且严格的格式描述参数是什么,参数的类型,名称,默认值,要调用的函数的名称等。此处的WSDL示例显示该文件是人的可读(但不容易)。

对于第二个问题,有各种各样的答案。但是,实践中唯一使用的是SOAP。其主要思想是:将先前的XML(实际消息)包装到另一个XML(包含编码信息和其他有用的东西)中,然后通过HTTP发送。HTTP的POST方法用于发送消息,因为始终有一个body

整个方法的主要思想是将URL映射到一个函数,即一个action。因此,如果您在某台服务器上有一个客户列表,并且想要查看/更新/删除一个客户,则必须有3个URL:

  • myapp/read-customer 在邮件的正文中,传递要读取的客户的ID。
  • myapp/update-customer 然后在正文中传递客户ID以及新数据
  • myapp/delete-customer 和体内的ID

REST方法对事物的看法不同。URL不应代表动作,而应代表事物(在REST术语中称为资源)。由于HTTP协议(我们已经在使用)支持动词,因此请使用这些动词来指定对事物执行什么动作

因此,使用REST方法,可以在URL上找到12号客户myapp/customers/12。要查看客户数据,请使用GET请求命中URL。要删除它,请使用带有DELETE动词的相同 URL。要再次更新它,请使用带有POST动词的相同 URL,并在请求正文中添加新内容。

有关必须满足的服务才能被视为真正的RESTful的更多详细信息,请参阅Richardson成熟度模型。本文提供了示例,并且更重要的是,解释了为什么(所谓的)SOAP服务是0级REST服务(尽管0级意味着对该模型的依从性较低,这不是令人反感的,并且仍然有用)在许多情况下)。


您的意思REST是不是Web服务?那是什么JAX-RS
Ashish Kamble

1
@AshishKamble:我提供了其余服务规范的链接。官方定义仅包含WS- *协议(我们称之为“ SOAP”的协议),而其余部分则不正式
包含在内

1
@AshishKamble:另外,请注意,还有一个JAX-WS,意思是“ Web服务”,不同于“其余服务”。无论如何,正如我还指出的那样,区分对于任何实际目的都不重要。
blue_note

13

在许多答案中已经涵盖的许多其他问题中,我要强调的是SOAP可以定义合同,WSDL,WSDL定义支持的操作,复杂类型等。SOAP面向操作,而REST面向资源。就个人而言,我会选择SOAP来实现内部企业应用程序之间的复杂接口,而选择REST来实现与外界的公共,更简单,无状态的接口。

在此处输入图片说明


9

除了:

++接近REST时常犯的一个错误是将其视为“带有URL的Web服务”-将REST视为另一种远程过程调用(RPC)机制,例如SOAP,但通过普通HTTP URL调用,而没有SOAP的麻烦XML名称空间。

++相反,REST与RPC无关。RPC是面向服务的,并且侧重于动作和动词,而REST是面向资源的,强调了组成应用程序的事物和名词。


8

这些答案中有很多都完全忘记了提及REST根本所需的超媒体控件(HATEOAS)。其他一些人对此有感触,但并没有很好地解释它。

本文应该解释这些概念之间的区别,而不必深入了解特定的SOAP功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.