REST vs. SOAP


REST和SOPA争论很多,现在一些公司采取一个折中的策略,在内部使用REST接口,而对外使用SOAP服务,因为SOAP接口诞生比较早,比较普遍。

DZone一篇文章对目前REST和SOAP存在的误解进行了分析,目前认为REST存在三个难点:
1.没有一个良好的基于API的架构
2.难以整合。
3.没有被第三方广泛使用。
有人甚至认为2009年将是SOAPy故事,一些Web2.0公司将从REST向SOAP转移。

比较中立的观点是:WSDL ==服务,REST ==CRUD,REST是否能做服务呢?
我个人观点:关键在于对服务粒度的定义,SOA需要的粗粒度服务,不需要CRUD这样细粒度服务,但是REST提供不是CRUD,比CRUD更多,CRUD只是一种统一接口,就象SOAP是SOA的一种统一接口。这个问题就象DDD和SOA区别一样,REST资源与DDD的领域模型更接近,互为映射,
http://www.jdon.com/jivejdon/thread/34676)。

该文也认为:
REST能让您更简单地存取数据(如果你的服务比较简单); WSDL中为您提供了一个接口,这个接口界面更为复杂,而REST是更加灵活。

使用REST好处:
1.通过暴露自己的RESTful框架服务将允许其客户选择较简单的基于浏览器应用的集成。
2.REST客户端可以指定它可以理解的格式,通过http缓存提高性能,本质上更有效地marshal和unmarshal(如protobuf或JSON + GZip压缩)。

关于如何克服前面提到的三个难点?该文提出了自己的想法:
1. 目前大家对REST API已经越来越来有统一的认识,比如How to GET a cup of coffee就是一篇经典的REST架构使用。

2. 关于整合问题不是问题,只要你有合适的工具,比如使用浏览器等就能够无缝集成到一个应用程序的其他服务。将不断创造新的工具,以便更容易集成。

3. 关于第三方整合,目前可以提供REST和SOAP的混合接口方式,现在很多Web服务工具已经拓展提供REST支持。
AIXS 2的RESTful Web services Support

原文:From REST to SOAP

有一篇比较:REST vs. SOAP using HTTP – Choosing the Right WebService Protocol
文章将SOAP和REST从web服务应用角度进行了多个方面的比较,主要内容如下:

应用方面的比较:
Web2.0网站使用REST:Twitter, Yahoo’s web services use REST, Flickr, del.icio.us, pubsub, bloglines, technorati,

电子商务eBay 和Amazon提供REST 和 SOAP的两种Web服务.
SOAP是多用于企业应用和B2B之间整合以及与旧系统合并。


API 灵活性和简单性
简单和灵活有时是一对矛盾,灵活经常导致复杂,这就需要大道至简的方式复归简单。

基于SOAP的接口是面向业务的,程序员比较容易理解,但是因为是XML形式,需要SOAP toolkit,来进行请求和响应分析。

REST只是普通http,通过get post等方式操作,直接用浏览器比如FirxFox就可以查看http整个请求信息。

个人认为:
SOAP= http + XML + 业务方法。
REST的资源表现可以是XML,也可以是html或JSON之类超文本。
REST = http + 超文本 (相对SOAP的业务方法,REST是资源,资源是通过http的URI实现了)
两者比较下来,REST因为使用http天然的URI代表资源,没有象SOAP那样要基于XML表达业务方法,REST简单一些。


带宽流量情况
SOAP每次都需要XML打包和解包,在一次股票查询中,SOAP消耗的字节数要是REST的十倍。
SOAP支持者认为:SOAP基于XML的业务方法是一种语言性质强类型,强类型是一个分布式应用程序的必要的特征。业务方法调用需要事先知道方法参数才能调用,但是在请求这个方法之前必须提前知道这些方法参数的类型,这是在逻辑上站不住脚的。

当然REST也必须事先实现请求了解资源,但是REST的输出是人性化的,程序员可以通过浏览器直接读懂REST的输出数据,比如:给这个服务提供一个股票代号的输入参数,例如以q=symbol形式,这样,这个服务就能返回这个股票的当前价格字符串。


安全
SOAP支持这认为通过标准http发送RPC请求是一个能够支持跨组织领域的好的办法;REST管理员能够通过分析可以看出HTTP命令的请求中所用的每条消息的意图,一个GET请求可以认为是安全,因为它定位只能获得数据,而不是修改数据。

在认证鉴权方面,我个人认为:
SOAP和REST都是基于http,安全比较差不多,SOAP和REST都可以利用Web服务器的认证授权机制,不过REST由于基于URI,可以直接利用URI等ACL访问权限机制,而SOAP由于暴露的是粗粒度SOA业务方法,可能还需要在业务服务层设置一道ACL机制。

POST
在数据提交方面,SOAP是一个赢家,可以传递完美无瑕的所有文本和二进制文件,所以,首先试验REST,然后必要时使用SOAP。

个人总结:
1.REST是GET能手, SOAP是POST能手,
2.SOAP暴露业务方法,REST暴露模型资源。

当然,这篇文章没有将两者在可伸缩性上比较,REST从资源状态入手,可把负载平衡引入到系统内部。伸缩性融入REST血液,而SOAP则必须将可伸缩性作为非功能性需求额外考虑。