具象状态转移(REST)和简单对象访问协议(SOAP)

有人可以解释什么是REST ,什么是纯英文的SOAP ? Web服务如何工作?

关于SOAP和REST的简单解释

SOAP – “简单对象访问协议”

SOAP是一种通过Internet传输消息或less量信息的方法。 SOAP消息采用XML格式,通常使用HTTP(超文本传输​​协议)发送。


代表性的国家转移

rest是在客户端和服务器之间发送和接收数据的一种简单方式,并且没有定义很多标准。 您可以发送和接收数据为JSON,XML甚至纯文本。 与SOAP相比,它的权重较轻。


在这里输入图像描述

这两种方法都被许多大型玩家所使用。 这是一个偏好的问题。 我的首选是REST,因为使用和理解起来更简单。

简单对象访问协议(SOAP):

  • SOAP在HTTP或有时TCP / IP之上构build一个XML协议。
  • SOAP描述了函数和数据types。
  • SOAP是XML-RPC的inheritance者,非常相似,但描述了一种标准的通信方式。
  • 有几种编程语言对SOAP有本地支持,通常给它一个Web服务URL,你可以调用它的Web服务函数而不需要特定的代码。
  • 发送的二进制数据必须首先编码为base64编码的格式。
  • 有几个与之相关的协议和技术:WSDL,XSD,SOAP,WS-Addressing

具象状态转移(REST):

  • REST不需要通过HTTP,但下面的大部分要点都会有HTTP偏差。
  • REST非常轻便,它说等一下,我们不需要SOAP创build的所有这些复杂性。
  • 通常使用普通的HTTP方法而不是描述一切的大XML格式。 例如,要获取使用HTTP GET的资源,可以在使用HTTP PUT的服务器上放置资源。 要删除服务器上的资源,请使用HTTP DELETE。
  • REST非常简单,因为它使用HTTP GET,POST和PUT方法来更新服务器上的资源。
  • REST通常最适用于面向资源的体系结构(ROA)。 在这种思维模式下,一切都是一种资源,你将在这些资源上运作。
  • 只要你的编程语言有一个HTTP库,而且大部分都可以,你可以很容易地使用REST HTTP协议。
  • 二进制数据或二进制资源可以根据请求简单地传送。

在谷歌上有关于REST vs SOAP的无休止的争论 。

我最喜欢的是这一个 。 2013年11月27日更新:Paul Prescod的网站似乎已经脱机,这篇文章已经不复存在了,虽然可以在Wayback Machine上find,但是可以在CiteSeerX 上findPDF格式。

rest

我明白REST的主要思想非常简单。 我们已经使用networking浏览器多年,我们已经看到了如何简单,灵活,表演等网站。 HTML网站使用超链接和表单作为用户交互的主要手段。 他们的主要目标是让我们客户知道我们目前可以使用的那些链接。 而REST只是说'为什么不通过我们的应用程序使用相同的原则来驱动计算机而不是人类客户? 将它与WWW基础设施的强大function结合在一起,您将获得构build伟大分布式应用程序的杀手级工具。

另一个可能的解释是math思考的人。 每个应用程序基本上都是一个状态机,其中业务逻辑操作是状态转换。 REST的思想是将每个转换映射到资源的某个请求上,并向客户端提供表示当前状态下可用转换的链接。 因此,它通过表示和链接来模拟状态机。 这就是为什么它被称为REpresentational状态转移。

所有答案似乎都集中在消息格式或HTTP动词使用方面,这是相当令人惊讶的。 实际上,消息格式根本不重要,只要服务开发者logging它,REST就可以使用任何一种格式。 HTTP动词仅使服务成为CRUD服务,但还不是RESTful。 真正将服务变成REST服务的是将超链接(又名超媒体控件)与数据一起embedded到服务器响应中,而且它们的数量必须足以让任何客户端从这些链接中select下一个动作。

不幸的是,除了Roy Fielding的论文 ,在网上findREST的正确信息是相当困难的 。 (他是派生REST的人)。 我会推荐“REST in Practice”一书,因为它提供了一个关于如何从SOAP发展到REST的全面的分步教程。

肥皂

这是RPC(远程过程调用)体系结构风格的可能forms之一。 实质上,这只是一种技术,允许客户端通过服务边界(networking,进程等)调用服务器的方法,就像调用本地方法一样。 当然,实际上它不同于在速度,可靠性等方面调用本地方法,但这个想法很简单。

相比

比较任何forms的RPC到REST时,诸如传输协议,消息格式,xsd,wsdl等的细节并不重要。 主要区别在于,RPC服务通过在RPC API中devise自己的应用程序协议来重新发明自行车,并且只有它知道的语义。 因此,在使用服务之前,所有的客户端都必须理解这个协议,并且由于所有请求的专有语义,所以不能build立像caching这样的通用基础设施。 此外,RPC API并不build议在当前状态下允许执行什么操作,这必须从其他文档中派生。 另一方面,REST意味着使用统一接口来允许不同的客户端对API语义有一定的了解,而超媒体控件(链接)可以突出显示每种状态下的可用选项。 因此,它允许caching响应来扩展服务,并且无需额外的文档就可以很容易地发现正确的API使用。

从某种意义上说,SOAP(与任何其他RPC一样)是试图通过服务边界来处理连接媒体的一种尝试,因为它只能够传输消息。 REST是一个决定,承认networking是一个巨大的分布式信息系统,接受现实世界,学会掌握它而不是反对它。

当你同时控制服务器和客户端,并且交互不太复杂时,SOAP看起来对于内部networkingAPI来说是非常好的。 开发者使用它更自然。 但是,对于一个被许多独立方使用的公共API来说,这个API是复杂而庞大的,所以REST应该更适合。 但是这最后的比较是非常模糊的。

更新

我的经验意外地显示REST开发比SOAP更困难。 至less对于.NET来说。 虽然ASP.NET Web API有很好的框架,但是没有可以自动生成客户端代理的工具。 没有像“添加Web服务参考”或“添加WCF服务参考”。 一个人必须手工编写所有序列化和服务查询代码。 而男人,这是很多的样板代码。 我认为REST开发需要类似于每个开发平台的WSDL和工具实现。 事实上,似乎有一个很好的理由: WADL或WSDL 2.0 ,但是这两个标准似乎都没有得到很好的支持。

更新(2016年1月)

结果发现现在有各种各样的 REST API定义工具 。 我个人偏好目前是RAML 。

Web服务如何工作

那么这是一个太宽泛的问题,因为它取决于特定Web服务中使用的体系结构和技术。 但一般来说,Web服务只是Web中的一些应用程序,可以接受来自客户端的请求并返回响应。 它暴露给Web,因此它是一个Web服务,它通常是全天候可用的,这就是为什么它是一个服务 。 当然,它为客户解决了一些问题(否则为什么有人会使用Web服务)。

这是你将find的最简单的解释。

这篇文章以丈夫的妻子叙述为例,丈夫以纯粹的外行人的语言向妻子解释REST。 必读!

如何解释 – rest – 我的妻子 (原链接)
如何解释 – rest – 我的妻子 (2013-07-19工作环节)

SOAP – 简单对象访问协议是一种协议

REST – Representational State Transfer是一种build筑风格

SOAP是用于通常通过HTTP传输消息的XML协议

RESTSOAP可以说是 相互排斥的。 RESTful体系结构可能使用HTTPSOAP或其他通信协议。 REST针对networking进行了优化,因此HTTP是一个完美的select。 HTTP也是Roy Fielding的文章中讨论的唯一协议。

虽然REST和SOAP显然是非常不同的,但这个问题确实certificate了RESTHTTP通常是串联使用的。 这主要是由于HTTP的简单性以及对RESTful原则的非常自然的映射。

基本的REST原则

客户端 – 服务器通信

客户端 – 服务器体系结构具有非常明显的关注点。 所有以REST风格构build的应用程序也都必须是客户端服务器。

无状态

每个客户端对服务器的请求都要求其状态得到充分的表示。 服务器必须能够完全理解客户端请求,而不使用任何服务器上下文或服务器会话状态。 因此,所有国家都必须留在客户身上。 我们将在稍后更详细地讨论无国籍代表。

可caching

可以使用高速caching约束,从而使响应数据被标记为可高速caching或不可高速caching。 标记为可caching的任何数据可以被重新用作对相同的后续请求的响应。

统一的界面

所有组件必须通过一个统一的接口进行交互。 因为所有的组件交互都是通过这个接口进行的,所以与不同服务的交互非常简单 界面是一样的! 这也意味着实施的变化可以孤立地进行。 这种变化不会影响基本的组件交互,因为统一的接口总是不变的。 一个缺点是你被困在界面上。 如果通过更改界面可以为特定服务提供优化,那么REST禁止这样做是不可能的。 然而,好的一面是,REST针对networking进行了优化,因此REST over HTTP的受欢迎程度令人难以置信!

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

有关REST和上述子项目的更多详细信息,请参阅REST Design Principals上的此博客文章 。

我喜欢Brian R. Bondy的回答。 我只想补充一点,维基百科提供了对REST的清晰描述。 这篇文章区别于SOAP。

REST是一个交换状态信息,尽可能简单地完成。

SOAP是使用XML的消息协议。

许多人从SOAP转移到REST的主要原因之一是与基于SOAP的Web服务相关的WS- *(称为WS splat)标准极其复杂。 请参阅维基百科以获取规格列表。 每个规格都非常复杂。

编辑:由于某些原因,链接显示不正确。 REST = http://en.wikipedia.org/wiki/REST

WS- * = http://en.wikipedia.org/wiki/WS- *

SOAP Web服务和REST Web服务都可以使用HTTP协议和其他协议(仅仅提到SOAP可以是REST的底层协议)。 我只会谈论HTTP协议相关的SOAP和REST,因为这是它们最常用的用法。

肥皂

SOAP (“简单”对象访问协议)是一个协议(和一个W3C标准 )。 它定义了如何创build,发送和处理SOAP消息。

  • SOAP消息是具有特定结构的XML文档:它们包含一个包含标题和正文部分的信封。 主体包含我们想要发送的实际数据 – 以XML格式。 有两种编码风格 ,但我们通常select文字 ,这意味着我们的应用程序或其SOAP驱动程序执行数据的XML序列化和非序列化。

  • SOAP消息以SOAP + XML MIME子types作为HTTP消息传播。 这些HTTP消息可以是多段的,所以我们可以select将文件附加到SOAP消息。

  • 很显然,我们使用客户端 – 服务器体系结构,所以SOAP客户端向SOAP Web服务器发送请求,服务将响应发送给客户端。 大多数Web服务使用WSDL文件来描述服务。 WSDL文件包含我们要发送的数据的XML模式(以下简称XSD)和定义web服务如何绑定到HTTP协议的WSDL绑定。 有两种绑定风格 :RPC和文档。 通过RPC样式绑定,SOAP主体包含具有参数(HTTP请求)或返回值(HTTP响应)的操作调用的表示。 参数和返回值将根据XSD进行validation。 通过文档样式绑定,SOAP主体包含一个针对XSDvalidation的XML文档。 我认为文档绑定风格更适合基于事件的系统,但我从来没有使用过这种绑定风格。 RPC绑定风格更为stream行,因此大多数人使用SOAP来分布式应用程序的XML / RPC目的。 Web服务通常通过询问UDDI服务器来find对方。 UDDI服务器是存储Web服务位置的registry。

SOAP RPC

所以 – 在我看来 – 最stream行的SOAP Web服务使用RPC绑定风格和文字编码风格,它具有以下属性:

  • 它将URL映射到操作。
  • 它使用SOAP + XML MIME子types发送消息。
  • 它可以有一个服务器端会话存储,没有约束。
  • SOAP客户端驱动程序使用服务的WSDL文件将RPC操作转换为方法。 客户端应用程序通过调用这些方法与SOAP Web服务进行通信。 所以大部分的SOAP客户端都会因为接口的改变而中断(导致方法名称和/或参数的改变)。
  • 使用RDF编写不会因为接口更改而中断的SOAP客户端,并通过语义来查找操作是可能的,但是语义Web服务非常罕见,并且它们不一定有非破坏客户端(我猜)。

rest

REST(代表性状态转移)是Roy Fielding 论文中描述的一种体系结构风格。 它不涉及像SOAP这样的协议。 它从没有约束的空构架风格开始,逐个定义了REST架构的约束条件。 人们使用术语RESTful来完成所有REST约束的web服务,但根据Roy Fielding的说法, REST级别没有。 当一个Web服务不符合每个REST约束时,它就不是一个REST Web服务。

REST约束

  • 客户机 – 服务器体系结构 – 我认为这部分是每个人都熟悉的。 REST客户端与REST Web服务器进行通信,Web服务器将维护常见的数据资源状态,并将其提供给客户端。
  • 无状态 – “状态转移”部分的缩写:REST。 客户端维护客户端状态(会话/应用程序状态),所以服务不能有会话存储。 客户端通过每个请求将相关部分的客户端状态转移到响应资源状态相关部分(由他们维护)的服务。 所以请求没有上下文,它们总是包含处理它们的必要信息。 例如,通过HTTP基本authentication,用户名和密码由客户端存储,并且每个请求发送它们,因此authentication发生在每个请求。 这与仅通过login进行身份validation的常规Web应用程序非常不同。 我们可以使用像内存(javascript),cookies,localStorage等任何客户端数据存储机制来保持客户端状态的某些部分(如果我们想的话)。 无状态约束的原因在于,即使服务器不需要维护每个客户端的会话,即使负载很高(数百万用户),服务器也能很好地扩展。
  • caching – 响应必须包含可由客户端caching的信息。 这进一步提高了可扩展性。
  • 统一的界面

    • 资源标识 – REST资源与RDF资源相同。 根据Fielding的说法,如果你能说出一些东西,那么它可以是一个资源,例如:“当前的本地天气”可以是资源,或者“你的手机”可以是资源,或者“特定的网页文件”资源。 要标识资源,您可以使用资源标识符:URL和URN(例如书籍的ISBN编号 )。 一个标识符应该只属于一个特定的资源,但一个资源可以有很多标识符,我们经常利用例如https://example.com/api/v1/users?offset=50&count=25 。 URL有一些规范 ,例如具有相同path但不同查询的URL不相同,或path部分应包含URL的分层数据,查询部分应包含非分层数据。 这些是如何通过REST创buildURL的基础知识。 顺便说一句。 URL结构只对服务开发者很重要,一个真正的REST客户端不关心它。 另一个常见的问题是API版本控制,这是一个简单的问题,因为根据Fielding,资源唯一不变的是语义。 如果语义改变,那么你可以添加一个新的版本号。 您可以使用经典的3号码版本控制,并只将主要号码添加到URL( https://example.com/api/v1/ )。 所以通过向后兼容的变化,没有任何反应,通过非向后兼容的变化,你将有一个新的API根https://example.com/api/v2/的非向后兼容的语义。 所以旧客户端不会中断,因为他们可以使用旧的语义https://example.com/api/v1/
    • 通过表示操作资源 – 您可以通过将资源的预期表示forms(连同HTTP方法和资源标识符)发送到REST服务来操纵与资源相关的数据(资源状态)。 例如,如果要在结婚后重命名用户,可以发送PATCH https://example.com/api/v1/users/1 {name: "Mrs Smith"}请求,其中{name: "Mrs Smith"}是预期资源状态的JSON表示,换句话说:新名称。 反过来也是如此,服务向客户端发送资源表示以改变其状态。 例如,如果我们想读取新的名字,我们可以发送一个GET https://example.com/api/v1/users/1?fields="name"检索请求,这个请求会导致一个200 ok, {name: "Mrs Smith"}回应。 所以我们可以使用这个表示来改变客户端状态,例如我们可以显示一个“欢迎来到我们的页面史密斯夫人!” 信息。 根据资源标识符(URL)或我们随请求发送的accept标头,资源可以有很多表示forms。 例如,如果请求image/jpeg我们可以发送一个Smith女士的图像(可能不是裸体)。
    • 自描述性消息 – 消息必须包含有关如何处理它们的信息。 例如URI和HTTP方法,内容types头,caching头,描述数据含义的RDF等等。使用标准方法很重要。 知道HTTP方法的规范是很重要的。 例如,GET表示检索由请求URL标识的信息,DELETE表示请求服务器删除由给定URL标识的资源,等等…… HTTP状态码也有规范 ,例如200表示成功,201表示成功一个新的资源已经创build,404意味着在服务器上找不到请求的资源,等等。使用现有的标准是REST的一个重要部分。
    • 超媒体作为应用程序状态的引擎(以下简称HATEOAS) – 超媒体是一种可以包含超链接的媒体types。 在networking上,我们遵循链接 – 通过超媒体格式(通常是HTML)描述 – 来实现目标,而不是将URLinput到地址栏中。 REST遵循相同的概念,由服务发送的表示可以包含超链接。 我们使用这些超链接向服务发送请求。 有了这个响应,我们得到了可以用来构build新客户端状态的数据(可能还有更多的链接),等等……所以这就是为什么超媒体是应用程序状态(客户端状态)的引擎。 您可能想知道客户如何识别并遵循超链接? 对于人来说,这非常简单,我们阅读链接的标题,也许填写input字段,然后只需点击一下即可。 通过机器,我们必须添加语义到与RDF的链接(通过与Hydra的JSON-LD )或超媒体特定的解决scheme(例如IANA链接关系和由HAL + JSON 供应商特定的MIMEtypes )。 有许多机器可读的XML和JSON超媒体格式 ,只是它们的简短列表:

      • XHTML
      • ATOM + XML
      • RDF + XML
      • HAL + XML
      • HAL + JSON
      • JSON-LD
      • RDF + JSON
      • 警笛
      • collections+ JSON

      有时很难select…

  • 分层系统 – 我们可以在客户端和服务之间使用多层。 他们中没有人应该知道所有这些附加层,只是旁边的层。 这些层可以通过应用caching和负载平衡来提高可伸缩性,也可以实施安全策略。
  • 按需代码 – 我们可以发送代码扩展客户端的function,例如JavaScript代码到浏览器。 这是REST的唯一可选约束。

REST webservice – SOAP RPC webservice差异

因此,一个REST webservice与SOAP webservice(带有RPC绑定风格和文字编码风格)非常不同,

  • 它定义了一个统一的接口(协议的intead)。
  • 它将URL映射到资源(而不是操作)。
  • 它发送消息与任何MIMEtypes(而不是SOAP + XML)。
  • 它有一个无状态的通信,所以它不能有一个服务器端会话存储。 (SOAP对此没有限制)
  • 它提供超媒体,客户使用超媒体包含的链接来请求服务。 (SOAP RPC使用WSDL文件中描述的操作绑定)
  • 只有通过语义更改才能通过URL更改来中断。 (不使用RDF语义的SOAP RPC客户端会因WSDL文件更改而中断。)
  • 由于其无状态行为,它比SOAP Web服务的规模更好。

等等…

SOAP RPC Web服务不能满足所有的REST约束:

  • 客户端 – 服务器架构 – 永远
  • 无国籍 – 可能
  • caching – 可能
  • 统一的界面 – 从不
  • 没有分层的系统
  • 按需代码(可选) – 可能的

那么我将从第二个问题开始: 什么是Web服务? ,原因很明显。

Web服务本质上是一些逻辑(你可能会隐含地称为一种方法),它暴露某些function或数据。 客户端实现(技术上来说, 消费就是这个词)只需要知道方法将要接受的参数以及它将要返回的数据的types(如果有的话)。

以下链接以非常清晰的方式说明了RESTSOAP的全部内容。

REST vs SOAP

如果你也想知道什么时候select什么(REST或者SOAP),所有理由都要经历它!

SOAP和REST都是指不同系统彼此交谈的方式。

REST使用类似于浏览器与Web服务器通信的技术来执行此操作:使用GET请求网页,在表单域中进行POST

SOAP提供了类似的东西,但通过来回发送XML块来完成所有的工作。 SOAP的另一个关键组件是WSDL,它是描述支持哪些function和数据元素的XML文档。 可以使用WSDL以编程方式“发现”支持的function以及生成编程代码存根。

REST是devisenetworking应用程序的架构风格。 这个想法是,不是使用诸如CORBA,RPC或SOAP之类的复杂机制来连接机器,而是使用简单的HTTP在机器之间进行调用。

我认为这是很容易解释的。 请,任何人都欢迎纠正我或补充到这一点。

SOAP是断开连接的系统(如跨互联网)用来交换信息/数据的消息格式。 它与XML消息来回。

Web服务传输或接收SOAP消息。 他们的工作方式取决于他们写的是什么语言。

SOAP的问题在于它与HTTP堆栈背后的理想相冲突。 任何中间件都应该能够在不理解请求或响应的内容的情况下处理HTTP请求,但是例如,常规的HTTPcaching服务器不能处理SOAP请求,而不知道SOAP内容的哪些部分用于caching。 SOAP只是使用HTTP作为自己的通信协议的包装,就像代理一样。

SOAP – “简单对象访问协议”

SOAP在Internet上转移消息或less量的信息是微不足道的。 SOAP消息使用XML进行格式化,通常是通过发送来控制HTTP

REST – “重新呈现状态转移”

REST是粉丝和服务器之间偶然发生和接收信息的基础,它没有明确的许多标准。 您可以发送和接受信息为JSONXML甚至纯文本。 与SOAP相比,它的权重较轻。

基于SOAP的Web服务简而言之,基于SOAP的服务模型将世界视为一个不能相互控制的同等同行的生态系统,但必须遵守已发布的合同。 这是一个混乱的现实世界的有效模型,基于元数据的合同形成了SOAP服务接口。

我们仍然可以将SOAP与基于XML的远程过程调用相关联,但是基于SOAP的Web服务技术已经成为一个灵活而强大的消息传递模型。

SOAP假设所有系统都是独立的,没有任何系统具有其他内部function的内部知识。 大多数这样的系统可以做的是互相发送信息,并希望他们会采取行动。 系统发布他们承诺要履行的合同,其他系统依靠这些合同与他们交换信息。

系统之间的合同统称为元数据,包括服务描述,支持的消息交换模式和pipe理服务质量的策略(服务可能需要被encryption,可靠地交付等)。服务描述又是详细的规定将由系统发送和接收的数据(消息文件)。 使用XML描述语言(如XML模式定义)描述文档。 只要所有的系统都遵守已经发布的合同,它们就可以相互操作,系统内部的改变也不会影响到其他系统。 每个系统负责将自己的内部实现转换为合同

REST – 重新呈现国家转移。 物理协议是HTTP。 基本上,REST是networking上唯一可以通过URL识别的所有不同资源。 所有可以在这些资源上执行的操作都可以用一组有限的动词(“CRUD”动词)来描述,这些动词又映射到HTTP动词。

REST比SOAP更“重量级”。

Web服务的工作