我读过关于SOAP和REST作为web服务通信协议的区别的文章,但是我认为REST相对于SOAP的最大优势是:

REST更加动态,不需要创建和更新UDDI(通用描述、发现和集成)。 REST不仅限于XML格式。RESTful web服务可以发送纯文本/JSON/XML。

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

那么,这些点我说对了吗?


当前回答

首先:正式来说,正确的问题应该是web服务+ WSDL + SOAP vs REST。 因为,虽然web服务在松散的意义上使用,当使用HTTP协议来传输数据而不是web页面时,它是这个想法的一种非常具体的形式。根据定义,REST不是“web服务”。 但实际上,每个人都忽略了这一点,所以我们也忽略它吧

已经有了一些技术上的答案,所以我将尝试提供一些直观的答案。

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

你应该发送什么格式的信息 信息应该如何来回传递

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

关于第二个问题,有各种各样的答案。然而,在实践中唯一使用的是SOAP。它的主要思想是:将之前的XML(实际消息)包装成另一个XML(包含编码信息和其他有用的内容),并通过HTTP发送它。HTTP的POST方法用于发送消息,因为总是有消息体。

整个方法的主要思想是将URL映射到函数,即映射到操作。所以,如果你在某个服务器上有一个客户列表,你想查看/更新/删除一个,你必须有3个url:

Myapp /read-customer和在消息体中传递要读取的客户的id。 Myapp /update-customer和在body中传递客户的id以及新数据 Myapp /delete-customer和body中的id

REST方法有不同的看法。URL不应该代表一个动作,而是一个东西(在REST行话中称为资源)。因为HTTP协议(我们已经在使用)支持动词,所以使用这些动词来指定对该对象执行什么操作。

因此,使用REST方法,客户号12将在URL myapp/customers/12上找到。要查看客户数据,请使用GET请求点击URL。要删除它,使用相同的URL,使用delete动词。要更新它,再次使用带有POST谓词的相同URL和请求主体中的新内容。

有关服务必须满足才能被认为是真正RESTful的需求的更多细节,请参阅Richardson成熟度模型。本文给出了一些示例,更重要的是,解释了为什么(所谓的)SOAP服务是0级REST服务(尽管0级意味着对该模型的低遵从性,但它并不令人反感,并且在许多情况下仍然有用)。

其他回答

具象状态传输 对象的代表性状态传输是REST,即我们不发送对象,我们发送对象的状态。 REST是一种架构风格。它没有像SOAP那样定义那么多标准。REST用于公开公共api(例如:Facebook API,谷歌Maps API)通过互联网处理数据的CRUD操作。REST的重点是通过单一一致的接口访问命名资源。

简单对象访问协议 SOAP带来了自己的协议,并专注于将应用程序逻辑(而不是数据)片段作为服务公开。SOAP公开操作。SOAP关注于访问命名操作,每个操作实现一些业务逻辑。虽然SOAP通常被称为web服务,但这是用词不当。SOAP与Web几乎没有任何关系。REST提供了基于uri和HTTP的真正Web服务。

为什么休息?

由于REST使用标准的HTTP,它在任何方面都要简单得多。 REST更容易实现,需要的带宽和资源更少。 REST允许许多不同的数据格式,而SOAP只允许XML。 REST由于对JSON的支持,可以更好地支持浏览器客户端。 REST具有更好的性能和可伸缩性。REST读取可以被缓存,基于SOAP的读取不能被缓存。 如果安全不是主要问题,而我们的资源有限。或者我们想要创建一个其他开发人员可以轻易公开使用的API,那么我们应该选择REST。 如果我们需要无状态的CRUD操作,那么就使用REST。 REST通常用于社交媒体、网络聊天、移动服务和谷歌地图等公共api。 RESTful服务为相同的资源返回各种MediaTypes,这取决于请求头参数“Accept”,如application/xml或application/json for POST和/user/1234。json或GET /user/1234.xml。 REST服务应该由客户端应用程序调用,而不是由最终用户直接调用。 REST中的ST来自于状态传输。您可以四处传输状态,而不是让服务器存储它,这使得REST服务具有可伸缩性。

为什么肥皂?

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

source1 source2

很多答案完全忘记了超媒体控件(HATEOAS),这是REST的基础。其他一些人也提到了这个问题,但并没有很好地解释它。

本文将解释这两个概念之间的区别,而不涉及具体SOAP特性的细节。

SOAP(简单对象访问协议)和REST(表示状态传输)都有自己的美丽之处。所以我没有比较它们。相反,我试图描述我喜欢使用REST和SOAP的情况。

什么是有效载荷?

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

现在,举个例子,我要发一封电报,我们都知道电报的费用取决于某些词语。

那么告诉我下面提到的这两条信息,哪一条发的更便宜?

<name>Arin</name>

or

"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的东西。所以Rest并不完全安全,对吧?

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

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

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

我没有得出任何结论,但我更喜欢基于soap的web服务,而安全性、事务等是主要考虑的问题。

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

希望你喜欢我的回答。

恕我直言,你不能比较SOAP和REST,因为它们是两种不同的东西。

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

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

REST表示来自URL的服务器的状态(作为资源)。它是无状态的,客户端不应该有超出超媒体理解范围的与服务器交互的先验知识。

在众多答案中已经涉及的许多问题中,我将强调SOAP允许定义契约、WSDL(定义所支持的操作)、复杂类型等。 SOAP面向操作,而REST面向资源。 就我个人而言,对于企业内部应用程序之间的复杂接口,我会选择SOAP,而对于与外部世界的公共的、更简单的、无状态的接口,我会选择REST。