我读过关于SOAP和REST作为web服务通信协议的区别的文章,但是我认为REST相对于SOAP的最大优势是:
REST更加动态,不需要创建和更新UDDI(通用描述、发现和集成)。 REST不仅限于XML格式。RESTful web服务可以发送纯文本/JSON/XML。
但是SOAP更加标准化(例如:安全性)。
那么,这些点我说对了吗?
我读过关于SOAP和REST作为web服务通信协议的区别的文章,但是我认为REST相对于SOAP的最大优势是:
REST更加动态,不需要创建和更新UDDI(通用描述、发现和集成)。 REST不仅限于XML格式。RESTful web服务可以发送纯文本/JSON/XML。
但是SOAP更加标准化(例如:安全性)。
那么,这些点我说对了吗?
REST vs SOAP不是要问的正确问题。
REST与SOAP不同,它不是一个协议。
REST是一种架构风格,是一种针对基于网络的软件架构的设计。
REST概念被称为资源。资源的表示必须是无状态的。它通过某种媒体类型来表示。媒体类型的一些例子包括XML、JSON和RDF。资源由组件操作。组件通过标准的统一接口请求和操作资源。在HTTP的情况下,这个接口由标准的HTTP操作组成,例如GET, PUT, POST, DELETE。
@Abdulaziz的问题确实说明了REST和HTTP经常同时使用的事实。这主要是由于HTTP的简单性及其与RESTful原则的非常自然的映射。
REST基本原则
客户端和服务器之间的通信
客户机-服务器体系结构具有非常明显的关注点分离。所有以RESTful风格构建的应用程序原则上也必须是客户机-服务器。
无状态的
对服务器的每个客户机请求都要求完全表示其状态。服务器必须能够在不使用任何服务器上下文或服务器会话状态的情况下完全理解客户端请求。因此,所有的状态都必须保存在客户机上。
缓存
可以使用缓存约束,从而将响应数据标记为可缓存或不可缓存。任何标记为可缓存的数据都可以被重用作为对相同后续请求的响应。
统一的接口
所有组件必须通过一个统一的接口进行交互。因为所有组件的交互都是通过这个接口进行的,所以与不同服务的交互非常简单。界面是一样的!这也意味着可以孤立地进行实现更改。这些变化不会影响基本组件的交互,因为统一的接口总是不变的。一个缺点是你被界面束缚住了。如果通过更改接口可以为特定服务提供优化,那么您就不走运了,因为REST禁止这样做。然而,从好的方面来看,REST是为web优化的,因此REST在HTTP上非常流行!
上述概念代表了REST的定义特征,并将REST体系结构与其他体系结构(如web服务)区分开来。值得注意的是,REST服务是web服务,但web服务不一定是REST服务。
请参阅REST设计原则的博客文章,了解更多关于REST和上述要点的详细信息。
编辑:根据评论更新内容
不幸的是,关于REST有很多错误的信息和误解。不仅你的问题和@cmd的答案反映了这些,而且Stack Overflow上大多数与主题相关的问题和答案都反映了这些。
SOAP和REST不能直接比较,因为前者是一种协议(或者至少试图是),而后者是一种体系结构风格。这可能是引起混淆的原因之一,因为人们倾向于调用REST任何不是SOAP的HTTP API。
稍微推敲一下,试着建立一个比较,SOAP和REST之间的主要区别是客户机和服务器实现之间的耦合程度。SOAP客户机的工作方式类似于自定义桌面应用程序,与服务器紧密耦合。客户端和服务器之间有一个严格的契约,如果任何一方改变了任何东西,一切都将被打破。你需要在任何变化之后不断更新,但这样更容易确定合同是否被遵守。
REST客户机更像一个浏览器。它是一个通用的客户端,知道如何使用协议和标准化方法,应用程序必须适应其中。创建额外的方法不会违反协议标准,而是利用标准方法并在媒体类型上使用它们创建操作。如果处理得当,耦合会减少,并且可以更优雅地处理更改。除了入口点和媒体类型之外,客户端应该在对API一无所知的情况下进入REST服务。在SOAP中,客户端需要对它将要使用的所有东西有预先的了解,否则它甚至不会开始交互。此外,REST客户机可以通过服务器本身提供的按需代码进行扩展,经典的例子是用于驱动与客户端另一个服务的交互的JavaScript代码。
我认为这些是理解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替换为问题。Id并粘贴到浏览器上。这是无稽之谈,但这就是许多人认为的REST。
最后一点怎么强调都不为过。如果您的客户端从文档中的模板构建uri,而不是从资源表示中获取链接,那就不是REST。REST的作者Roy Fielding在这篇博客文章中明确表示:REST api必须是超文本驱动的。
考虑到以上内容,您将意识到尽管REST可能不局限于XML,但要正确地使用任何其他格式,您必须为链接设计和标准化某种格式。超链接在XML中是标准的,但在JSON中不是。JSON有一些标准草案,比如HAL。
最后,REST并不适合所有人,最能证明这一点的就是大多数人是如何用他们错误地称为REST的HTTP api很好地解决他们的问题的,而且从来没有冒险超越它。REST有时很难做到,尤其是在开始的时候,但是随着时间的推移,它会带来更容易的服务器端的发展,以及客户端对变化的弹性。如果你需要快速轻松地完成某件事,就不要为正确使用REST而烦恼了。这可能不是你要找的。如果您需要一些必须在网上保持数年甚至数十年的东西,那么REST就是为您准备的。
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设计可能是合适的。看一看。
希望你喜欢我的回答。
具象状态传输 对象的代表性状态传输是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
恕我直言,你不能比较SOAP和REST,因为它们是两种不同的东西。
SOAP是一种协议,REST是一种软件体系结构模式。在互联网上有很多关于SOAP和REST的误解。
SOAP定义了基于XML的消息格式,支持web服务的应用程序使用该格式在internet上相互通信。为了做到这一点,应用程序需要事先了解消息契约、数据类型等。
REST表示来自URL的服务器的状态(作为资源)。它是无状态的,客户端不应该有超出超媒体理解范围的与服务器交互的先验知识。
添加:
在使用REST时经常犯的一个错误是把它看作是“带有url的web服务”——把REST看作是另一种远程过程调用(RPC)机制,就像SOAP一样,但是通过纯HTTP url调用,没有SOAP庞大的XML名称空间。
相反,REST与RPC没有什么关系。RPC是面向服务的,关注动作和动词,而REST是面向资源的,强调组成应用程序的事物和名词。
很多答案完全忘记了超媒体控件(HATEOAS),这是REST的基础。其他一些人也提到了这个问题,但并没有很好地解释它。
本文将解释这两个概念之间的区别,而不涉及具体SOAP特性的细节。
在众多答案中已经涉及的许多问题中,我将强调SOAP允许定义契约、WSDL(定义所支持的操作)、复杂类型等。 SOAP面向操作,而REST面向资源。 就我个人而言,对于企业内部应用程序之间的复杂接口,我会选择SOAP,而对于与外部世界的公共的、更简单的、无状态的接口,我会选择REST。
首先:正式来说,正确的问题应该是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代表具象状态传输,它实际上是一种创建Web API的架构风格,它将一切(数据或功能)视为资源。 预计;通过URI公开资源,以多种格式进行响应,并以无状态方式对资源的状态进行代表性传输。这里我要讲两件事:
无状态方式:由HTTP提供。 状态的代表性转移:例如,如果我们要增加一名员工。 进入我们的系统,它在HTTP的POST状态,之后它将在HTTP的GET状态,PUT和DELETE同样。
REST可以使用SOAP web服务,因为它是一个概念,可以使用任何协议,如HTTP、SOAP。SOAP使用服务接口公开业务逻辑。REST使用URI公开业务逻辑。
没有HATEOAS,休息就不是休息。这意味着客户端只知道入口点URI,资源应该返回客户端应该遵循的链接。那些花哨的文档生成器为您在REST API中可以做的所有事情提供URI模式,它们完全忽略了这一点。他们不仅记录应该遵循标准的东西,而且当你这样做的时候,你把客户端耦合到API发展的一个特定时刻,API上的任何更改都必须被记录和应用,否则它就会崩溃。
HATEOAS是Hypermedia As The Engine Of Application State的缩写,是REST应用程序体系结构的一个约束,它区别于大多数其他网络应用程序体系结构。其原理是客户端完全通过应用服务器动态提供的超媒体与网络应用程序进行交互。REST客户端不需要预先了解如何与任何特定的应用程序或服务器交互,只需要对超媒体有一般的理解。相反,在一些面向服务的体系结构(SOA)中,客户机和服务器通过文档或接口描述语言(IDL)共享的固定接口进行交互。
参考1 参考2
尽管SOAP和REST在HTTP协议上有相似之处,但SOAP是一组比REST更严格的消息传递模式。SOAP中的规则是相关的,因为没有它们我们就无法实现任何程度的标准化。REST作为一种体系结构风格不需要处理,而且本质上更通用。本着信息交换的精神,SOAP和REST都依赖于公认的法律,每个人都决定遵守这些法律。 SOAP和REST的选择取决于所使用的编程语言、所使用的环境和规范。
要回答这个问题,了解分布式应用程序的架构从简单的分层架构到基于对象和服务的架构,再到基于资源的架构,现在我们甚至有了基于事件的架构,这是很有用的。大多数大型系统使用风格的组合。
第一个分布式应用程序具有分层的体系结构。我想这里的每个人都知道什么是层。这些结构被整齐地组织起来,并且可以是堆栈或循环结构。努力维护单向数据流。
基于对象的体系结构从分层体系结构发展而来,遵循一个更宽松的模型。在这里,每个组件都是一个对象(通常称为分布式对象)。对象之间使用类似于远程过程调用的机制进行交互——当客户端绑定到分布式对象时,它将对象接口的实现加载到其地址空间中。RPC存根可以封送请求并接收响应。同样,服务器上的对象接口是一个RPC样式的存根。这些基于对象的系统的结构组织得不是很整齐,它看起来更像一个对象图。
分布式对象的接口隐藏了它的实现。与分层组件一样,如果接口定义得很清楚,内部实现就可以改变——甚至完全替换。 基于对象的体系结构为封装服务提供了基础。服务是由自包含的实体提供的,尽管在内部它可以使用其他服务。逐渐地,基于对象的体系结构演变为面向服务的体系结构。
使用SOA,分布式应用程序由服务组成。这些服务可以跨管理域提供——它们可以在web上可用(即由云提供商提供的存储服务)。
随着web服务的流行,越来越多的应用程序开始使用它们,服务组合(将服务组合成新的服务)变得更加重要。SOA的一个问题是,集成不同的服务可能会变得极其复杂。
虽然SOAP是一种协议,但它的使用意味着面向服务的体系结构。SOAP试图为服务提供一种标准,通过这种标准,服务可以组合并易于集成。
基于资源的体系结构是解决SOA集成问题的不同方法。其思想是将分布式系统视为由组件单独管理的巨大资源集合。 这导致了RESTful体系结构的开发。RESTful服务的一个特征是无状态执行。这与由服务器维护状态的SOA不同。
那么……由面向服务的体系结构(包括使用SOAP的体系结构)提供的特定于服务的接口与基于资源的体系结构(如REST)相比如何?
虽然REST很简单,但它并没有为复杂的通信方案提供简单的接口。例如,如果要求使用事务REST是不合适的,那么最好将复杂状态封装在服务器上,而不是让客户端管理事务。但是在许多场景中,RESTful体系结构中资源的正交使用极大地简化了服务的集成,否则就意味着服务接口的激增。另一个权衡是基于资源的架构给客户端增加了更多的复杂性,并增加了网络上的流量,而基于服务的架构增加了服务器的复杂性,并占用了它的内存和CPU资源。
有些人还提到了常见的HTTP服务或其他不满足RESTful体系结构或SOAP需求的服务。这些也可以分为基于服务的或基于资源的。它们的优点是实现起来更简单。只有当您知道您的服务永远不需要跨管理域集成时,才会使用这种方法,因为这种方法不会试图修复出现的集成问题。
这些类型的基于http的服务,特别是伪rest式服务仍然是最常见的类型。实现SOAP是复杂的,只有当你真的需要它时才应该使用它——例如,你需要一个跨域容易集成的服务,并且你希望它有一个服务接口。在某些情况下仍然需要这样做。真正的rest式服务也很难实现,尽管没有SOAP那么难。
火休息
RESTful API是最著名的API类型。REST代表具象状态传输。
REST api是遵循标准化原则、属性和约束的api。
您可以使用HTTP谓词访问REST API中的资源。
REST api运行在一个简单的请求/响应系统上。您可以使用以下HTTP方法发送请求:
得到 帖子 把 补丁 删除 跟踪 选项 连接 头
下面是最常见的HTTP动词
GET(读取现有数据) POST(创建一个新的响应或数据) PATCH(更新数据) DELETE(删除数据)
客户机可以使用后跟端点的HTTP谓词发出请求。
端点(或路由)是您请求的URL。路径决定了您请求的资源。
当您向端点发送请求时,它将响应相关数据,这些数据通常格式化为JSON、XML、纯文本、图像、HTML等。
REST api还可以设计为许多返回不同类型数据的不同端点。使用REST API访问多个端点需要各种API调用。
一个实际的RESTful API遵循以下五个约束:
客户机-服务器体系结构 客户端向服务器请求数据,不需要第三方解释。 无国籍 无状态意味着每个HTTP请求都在完全隔离的情况下发生。每个请求都包含服务该请求所需的信息。服务器从不依赖以前请求的信息。没有国家。 缓存能力 响应可以显式或隐式地定义为可缓存或不可缓存,以提高可伸缩性和性能。例如,启用GET请求的缓存可以改善资源数据请求的响应时间。 分层 API体系结构的不同层应该协同工作,创建易于更新或调整的可伸缩系统。 统一的接口 客户端和服务器之间的通信必须使用独立于两者的标准化语言进行。这提高了可伸缩性和灵活性。
REST api非常适合需要它的项目
灵活的 可伸缩的 快
SOAP火
SOAP是一种必要的协议,它帮助引入api的广泛使用。
SOAP是简单对象访问协议的首字母缩写。
SOAP是一种标准化协议,它依赖于XML来发出请求和接收响应。
尽管SOAP是基于XML的,SOAP协议仍然被广泛使用。
SOAP API将数据作为服务提供,通常在执行涉及多个API调用或应用程序的事务时使用,其中安全性是主要考虑因素。
SOAP最初是在1998年为Microsoft开发的,它提供了一种标准机制,用于集成internet上的服务,而不考虑操作系统、对象模型或编程语言。
SOAP中的“S”代表Simple(简单),这是有原因的——SOAP可以以更低的复杂性使用,因为它在应用程序层对事务、安全性和其他功能的编码要求更少。
SOAP有三个主要特征:
SOAP API的可扩展性 SOAP允许扩展引入更健壮的特性,如Windows服务器安全性、寻址等等。 SOAP API的中立性 SOAP能够在广泛的协议上操作,如UDP、JMS、SMTP、TCP和HTTP。可以操作。 SOAP API的独立性 SOAP API响应完全基于XML。因此SOAP api是独立于平台和语言的。
开发人员继续争论使用SOAP和REST的利弊。最适合你的项目的是符合你的需求的。
SOAP api仍然是优先考虑安全性的公司实体和政府组织的首选,尽管REST在很大程度上主导了web应用程序。 SOAP比REST更安全,因为它使用WS-Security与安全套接字层一起进行传输 SOAP还具有更出色的事务可靠性,这是SOAP在历史上一直受到银行业和其他大型实体青睐的另一个原因。