为什么要使用REST而不是基于SOAP的服务?

为什么要使用REST而不是基于SOAP的服务?

Why would one use REST instead of SOAP based services?

今天参加了一个关于REST的有趣演示,然而,我想不出一个原因(也没有提出)为什么REST比基于SOAP的服务堆栈更好或更简单地使用和实现。

是什么原因导致"真实世界"中的任何人使用REST而不是基于SOAP的服务?


减少开销(没有SOAP信封来包装每个调用)

减少重复(HTTP已经表示DELETE,PUT,GET等操作,否则必须在SOAP信封中表示)。

更加标准化 - HTTP操作得到很好的理解并且运行一致。一些SOAP实现可能会变得挑剔。

更具人性化和可测试性(仅使用浏览器更难测试SOAP)。

不需要使用XML(你也不需要使用SOAP,但它很难理解,因为你已经在解析信封了)。

库使SOAP(有点)容易。但是正如我所指出的那样,你正在抽象出很多冗余。理论上是的,SOAP可以覆盖其他传??输,以避免在一层做类似的事情,但实际上几乎所有的SOAP工作都是通过HTTP实现的。


RESTful服务比基于SOAP的(常规)服务更容易使用。这样做的原因是REST基于正常的HTTP请求,这使得意图可以从正在进行的请求类型推断(GET = retrive,POST = write,DELETE = remove等等),并且完全是无状态的。另一方面,您可能会认为它不太灵活,因为它消除了包含请求上下文的消息信封的概念。

根据我的经验,SOAP是企业内部服务的首选,而REST则是公共API公开的服务的首选。

使用.NET框架中的WCF等工具,将服务实现为REST或SOAP非常简单。

一些相关的阅读:

  • 亚马逊网络服务博客:REST与SOAP
  • Dare Obasanjo经常写关于REST的文章


我假设当你说"web服务"时你指的是SOAP和WS- *标准集。 (否则,我可以说REST服务是"Web服务"。)

规范性的论点是,REST服务与Web设计更为匹配 - 即HTTP和相关基础架构的设计。因此,使用REST服务将与现有的Web工具和技术更兼容。

当然,一旦您深入研究具体细节,您会发现这两种方法在不同情况下都具有优势。是你感兴趣的那些细节吗?


作为良好的架构,开销并不重要。

REST不是一种协议,它是一种鼓励良好可扩展设计的架构。
通常选择它是因为RPC中过多的自由度很容易导致设计不佳。

另一个原因是基于HTTP的RESTful协议的可预测成本,因为它可以利用现有技术(主要是代理)。
RPC初始成本相当低,但随着负载增强,它往往会显着增加。


REST与实现无关,而且更加透明,这使得它非常适合公共API,特别是对于像Flickr,Amazon或Digg这样使用其API作为营销工具并且真正希望人们使用其数据的大型网站。他们不想成为那些试图调试他们选择的有缺陷的SOAP库的脚本语言的新手开发人员。

与SOAP和WSDL相比,它们更适合内部应用程序,在这些应用程序中,您可以使用嵌入式库和两端已知的知名人员。 (并且您可能不必关心诸如Internet规模的负载平衡,HTTP缓存等事情。)然后您获得自我记录的API,保留类型等,零工作。


要阅读Roy Fielding关于这个主题的最优秀的论文。他做了一个很好的案例,并且绝对是在他写作的时候(2000年)。


Steve Vinoski的博客和他的最新文章绝对值得一读。他是一名前CORBA大师,他曾与Michi Henning编写了关于这一主题的最佳书籍,"高级CORBA?用C ++编程"。但是,他已经看到了他的客户端/服务器方式的错误,现在发誓REST。


REST允许缓存非变异操作(通常使用GET动词)。 也就是说,由客户端缓存和/或由代理缓存。 这可能是一个巨大的胜利!


REST基本上只是实现Web服务的一种方式。它只是一种正确使用HTTP来查询您尝试访问的Web服务的方法。

http://www.xfront.com/REST-Web-Services.html
http://en.wikipedia.org/wiki/Representational_State_Transfer


这里有一个数据点:亚马逊提供REST和SOAP格式的API,85%的用法是REST。

REST更容易实现,更易于理解和更高的性能。


它非常简单和纤薄。您可以通过http动词:GET使用浏览器。
我没有找到一个浏览器可以轻松地手动执行通用的http POST请求


推荐阅读

    linux7关闭服务命令?

    linux7关闭服务命令?,系统,软件,服务,命令,电脑,状态,工具,管理,进程,用户,求

    linux服务器域名命令?

    linux服务器域名命令?,地址,信息,系统,网络,服务,环境,名称,网站,管理,电脑,l

    服务启动linux命令?

    服务启动linux命令?,服务,密码,信息,系统,名称,命令,文件,用户,下面,服务器,l

    linux服务器命令框?

    linux服务器命令框?,系统,情况,状态,信息,数据,软件,指标,服务,在线,工具,lin

    服务器linux命令教程?

    服务器linux命令教程?,系统,地址,密码,网络,设备,工作,服务,标准,连续,管理,

    linux删除服务的命令?

    linux删除服务的命令?,服务,系统,软件,平台,名称,管理,环境,产品,命令,文件,

    linux开机服务命令行?

    linux开机服务命令行?,系统,工作,地址,信息,服务,设备,数字,第一,设计,发行,l

    linux服务器分区命令?

    linux服务器分区命令?,系统,管理,信息,设备,时间,命令,基础,首次,平均,情况,l

    linux下看服务的命令?

    linux下看服务的命令?,服务,状态,系统,名称,信息,工具,命令,环境,网络,情况,

    linux服务器上传命令?

    linux服务器上传命令?,服务,软件,平台,数据,工具,系统,手机,电脑,设备,官网,

    linux服务更新命令?

    linux服务更新命令?,系统,工作,地址,信息,服务,命令,设备,标准,目录,功能,lin

    linux重新服务命令?

    linux重新服务命令?,服务,系统,网络,标准,工作,设备,命令,名称,信息,网络服

    linux网络服务器命令?

    linux网络服务器命令?,地址,网络,系统,名称,信息,工具,状态,中心,灵活,基础,l

    linux网络服务器命令?

    linux网络服务器命令?,地址,网络,系统,名称,信息,工具,状态,中心,灵活,基础,l

    linux服务器基本命令?

    linux服务器基本命令?,地址,系统,设备,网络,工作,标准,信息,电脑,命令,密码,l

    linux服务器下载命令?

    linux服务器下载命令?,服务,密码,系统,档案,工具,网络,公共,百度,地址,认证,l

    linux命令怎么停服务?

    linux命令怎么停服务?,服务,系统,状态,代码,跨行,软件,情况,第一,名称,命令,l

    linux服务端退出命令?

    linux服务端退出命令?,档案,命令,环境,异常,标准,网络,模式,终端,编辑,文件,l

    linux中启动服务命令?

    linux中启动服务命令?,服务,系统,命令,信息,工作,设备,网络,标准,名称,密码,l

    linux服务器常用命令?

    linux服务器常用命令?,工作,系统,地址,信息,命令,目录,管理,标准,设备,功能,