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

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

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

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


当前回答

什么是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

其他回答

什么是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

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

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

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

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

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

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

在众多答案中已经涉及的许多问题中,我将强调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级意味着对该模型的低遵从性,但它并不令人反感,并且在许多情况下仍然有用)。