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

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

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

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


当前回答

添加:

在使用REST时经常犯的一个错误是把它看作是“带有url的web服务”——把REST看作是另一种远程过程调用(RPC)机制,就像SOAP一样,但是通过纯HTTP url调用,没有SOAP庞大的XML名称空间。

相反,REST与RPC没有什么关系。RPC是面向服务的,关注动作和动词,而REST是面向资源的,强调组成应用程序的事物和名词。

其他回答

火休息

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在历史上一直受到银行业和其他大型实体青睐的另一个原因。

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

本文将解释这两个概念之间的区别,而不涉及具体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

要回答这个问题,了解分布式应用程序的架构从简单的分层架构到基于对象和服务的架构,再到基于资源的架构,现在我们甚至有了基于事件的架构,这是很有用的。大多数大型系统使用风格的组合。

第一个分布式应用程序具有分层的体系结构。我想这里的每个人都知道什么是层。这些结构被整齐地组织起来,并且可以是堆栈或循环结构。努力维护单向数据流。

基于对象的体系结构从分层体系结构发展而来,遵循一个更宽松的模型。在这里,每个组件都是一个对象(通常称为分布式对象)。对象之间使用类似于远程过程调用的机制进行交互——当客户端绑定到分布式对象时,它将对象接口的实现加载到其地址空间中。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那么难。

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