<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0' xmlns:dc='http://purl.org/dc/elements/1.1/'>
<channel>
<title>365Key-天天网摘 - dvdlkdvd的网摘(SOAP)</title>
<description>365Key-天天网摘 - dvdlkdvd的网摘(SOAP)</description>
<link>http://www.365key.com/rss/dvdlkdvd/SOAP/</link>
<generator>365Key (http://www.365key.com)</generator>
<language>zh-cn</language>
<docs>365Key-天天网摘 精彩导航</docs>
<image>http://counter.csdn.net/pv.aspx?id=88</image>
<item>
<title>Xerdoc Together ?Web Service : WebOS中的Function Call</title>
<link>http://www.365key.com/item/2467700</link>
<category>web_services; SOAP; REST</category>
<pubDate>Mon, 25 Dec 2006 03:23:25 GMT</pubDate>
<description>SOAP是面向活动，而REST是面向资源的
<blockquote>）SOAP

SOAP，全名是Simple Object Access Protocol，是Microsoft提交给W3C的Web Service协议。我觉得SOAP的两个最大的好处是：

协议的可扩展性（Extension Mechanism） 
良好的工具支持 
SOAP的消息称为一个SOAP Envelope，包括SOAP Header和SOAP BODY。其中，SOAP Header可以方便的插入各种其它消息来扩充Web Service的功能，比如Security（采用证书访问Web Service），SOAP BODY则是具体的消息正文，也就是Marshall后的信息。 

SOAP调用的时候，也就是向一个URL（比如http://ws.invesbot.com/stockquotes.asmx?WSDL）发送HTTP Post报文，调用方法的名字在HTTP Request Header SOAP-Action中给出，接下来就是SOAP Envelope了。

服务端接到请求，执行计算，将返回结果Marshall成XML，用HTTP返回给客户端。

SOAP的工具支持非常好，比如在.NET里，可以用WSDL.exe非常方便的为一个Web Service生成本地Proxy（Proxy模式），这样，你的程序就像调用本地API一样了，而由Framework为你完成Marshall和传送的工作。



3）REST

REST - Representational State Transfer, 是Roy Fielding的博士论文中提出的概念，其实，与其说REST是一种Web Service协议，不如说REST是一种Web based软件架构，一种基于Resource State的服务访问架构。

通俗的将，可以用你访问我的Blog的过程来描述REST的工作流程。当你访问我的Blog首页，其实就是对我的Blog的一个资源访问，那么Web Server会将这个资源的Representation返回给你，也就是我的Blog的首页的HTML。当你点击了这个HTML中的一个link，比如某篇Blog，你实际上就又对另一个资源发生了请求，Web Server会将新的资源Representation以HTML的形式发送给你。 

我曾经看过一个人对REST和SOAP的解释，我觉得很对，SOAP是面向活动，而REST是面向资源的。

Build一个Web Service，in SOAP way还是in REST way还是有很大的不同的。

比如说，要实现一个世界杯赛程、赛果、球员评分查询的这样一个简单的Web Service，如果用SOAP的话，我们可以生成一个WSDL：

http://www.mengyan.org/worldcup2006/?WSDL

它包含很多方法，比如GetMatchResult, GetPlayerScore, GetFixture，客户端通过调用这些Web Method来获得相应的数据。

如果用REST的方法来构架，就得先分析系统中都有那些资源，每一个资源有一个URL，比如：

http://www.mengyan.org/worldcup2006/fixture/?team=Brazil

http://www.mengyan.org/worldcup2006/match/?id=1

http://www.mengyan.org/worldcup2006/player/?name=Beckham

每种资源都是一个URL，然后利用URL Path或者Query来实现参数的传递，Response则是这个资源的一个表示形式。

当然，这些只是逻辑上的URL，具体的实现是采用URL Rewrite还是其它就可以你的具体设计了。

万事没有绝对，你也可以用其它方法设计REST Web Service。比如Flickr，它的Rest Service都是如下样子：

http://www.flickr.com/services/rest/?method=flickr.test.echo&amp;name=value 

也就是说，整个Service是一个资源，method变成了参数，用Method来标明不同的方法调用。我觉得，Flickr的REST Service其实还是采用传统的SOAP思想考虑的，只不过用了REST来实现。不能称作Thinking in REST way  。</blockquote></description>
<dc:creator>dvdlkdvd</dc:creator>
</item>
</channel></rss>
