全文2006年9月发布于Eric Newcomer博客中文版上:http://blog.csdn.net/ericnewcomer/archive/2006/09/15/1223762.aspx 摘要 Pete对上一篇blog文章的评论已引发出更多的评论。好,让我来尝试回答Pete在他的评论中所提出的问题吧。希望这篇文章能引起更多愉快而有益的讨论。。。 在我看来,Pete的主要问题是:哪些Web服务用例(use cases)体现了与REST用例的区别?它们各自应当在什么情况下采用?以及增添的Web服务复杂性在什么情况下是合理的? 也许这样的回答太过于简单化了,但我认为这是最好的概括:如果你要用浏览器来显示XML数据,那么就采用REST;如果你要把XML数据传给一个程序来处理,那么就采用SOAP。 关于Amazon.com的Web服务的使用情况是:去年,80%的开发者采用了XML over HTTP版,而20%的开发者采用了SOAP版。这是合理的,因为大多数Amazon.com用户所关心的是“用浏览器访问虚拟店铺时的数据显示”。不过,Amazon.com同时支持这两种风格的“Web服务”,因为也有开发者关注于“把数据传给程序作处理”。(为了明确起见,我将采用Amazon的术语——REST和SOAP Web服务)。 看待REST的一种方式是:它基本上意味着把Web服务请求放在URL里。 下面这个URL是我在Google.com中搜索“Skateboots”时得到的: http://www.google.com/search?hl=en&ie=UTF-8&q=%22Skateboots%22&btnG=Google+Search 基本上,Google是把我输入Web表单的关键字作为参数放在URL里(URL里还有其他一些关于字符集和即将执行的操作(比如“搜索”)的信息),并根据此URL来执行服务,然后在浏览器中返回结果。Google还会提示我:要搜索的是不是“Skate Boots”(即两个词,而不是我输入的单个词)。如果点击该提示链接的话,将会得到下面的URL: http://www.google.com/search?hl=en&ie=UTF-8&q=%22Skate+boots%22&spell=1 Amazon.com最近(2004年8月)发布的Web服务第4版继续一如既往地同时支持REST和SOAP请求。目前,有些人会争辩说REST和Web服务是不同的事物;而另一些人则认为,Web服务能做的,用REST也能做。在我看来,它们就像是相同操作的不同格式。 它们之间的区别似乎可以归结为:你是否希望用浏览器来解释结果数据。如果是的话,那么你最好还是采用REST请求(即把参数放在URL里)。但是,如果你要用程序来解释数据的话,你还是应该采用SOAP请求,因为它是用XML消息(而不是URL)来携带参数的。 下面是Amazon为基于REST的Web服务请求定义的格式: http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&SubscriptionId=[your subscription ID here]&Operation=ItemSearch&SearchIndex=Books&Keywords=dog&ResponseGroup=Request,Small 在你获得订购ID之后(不好意思,我还没有体验过获得一个订购ID),你可以把请求参数放在Firefox(或其他浏览器)地址栏中,然后按回车键执行之,并浏览XML结果。这最简单不过了。 但是,如果你要把XML数据传给程序处理的话(可能采用其他传输协议),SOAP请求格式将能够更好地胜任,因为它就是为此而设计的;消息所需的全部都在信封(envelope)里(即不依赖于传输协议的特征,比如固定接口、URL参数等)。如果采用REST请求的话,你得自己编写除在浏览器中显示XML以外的所有代码。而且,你在添加企业应用所需的重要特征(比如安全性、可靠性、事务性等)时,你也必须考虑如何编写相关代码。代码可能很快就会变得相当复杂。 接下来的讨论主要是围绕着开发工具进行的,因为开发工具在使用SOAP(以及WSDL)时是相当重要的。这里的基本问题是:像XMLSpy、Visual Studio、WebLogic Workshop、Artix Developer这样的工具是把工作简单化、还是复杂化了?按照Jeff Webb的说法,如果你要修改自动生成的VB类,采用SOAP会比较困难。如果你只是原封不动地使用SOAP请求,利用生成的代码,那么采用SOAP可能是处理XML的最简单、最直接的方式。 <以下略>