Thursday, April 24, 2008

Web Service,XMP-RPC,SOAP,WSDL,UDDI,SOA

Web Service
根据W3C的定义,Web Service就是一个被设计来用于支持网络上机器到机器之间交互的软件系统。
简单来说,Web Service可以被看作一系列的Web API,它们可通过网络被远程调用。
比如说有一个歌词服务器提供一个API为getLyric,则我们只需要发送请求getLyric("someSongName"),则可以期待从服务器返回歌词。

摘抄网络上得到的另一个例子:

<quote>

从表面上看,Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。
这就是说,你能够用编程的方法通过Web来调用这个应用程序。
我们把调用这个 Web service 的应用程序叫做客户。

例如,你想创建一个Web service ,它的作用是返回当前的天气情况。
那么你可已建立一个ASP页面,它接受邮政编码作为查询字符串,然后返回一个由逗号隔开的字符串,包含了当前的气温和天气。
要调用这个ASP页面,客户端需要发送下面的这个HTTP GET请求:

http://host.company.com/weather.asp?zipcode=20171

返回的数据就应该是这样:

21,晴

这个ASP页面就应该可以算作是Web service 了。
因为它基于HTTP GET请求,暴露出了一个可以通过Web调用的API。
当然,Web service 还有更多的东西。

</quote>

最常见的三种Web Service风格分别是RPC,SOA和REST。

1.RPC(Remote Procedure Call)
这是最基本最原始的方法,但是往往由于其调用方法与具体语言绑定,因此被建议废弃。

2.SOA(Service-oriented architecture)

3.REST(Representational state transfer)

-------------------------------------------------------------------------------

XML-RPC
XML-RPC是一个使用XML编码其调用,并使用HTTP协议进行传输的RPC协议。
由于其非常简单易用,因此得到大量广泛的应用。
随着新功能的引入,这个标准发展成了SOAP。
然而由于其易用性,许多人仍然喜欢使用改协议

一个典型的XML-RPC调用的例子如下:

<?xml version="1.0"?>
<methodCall>
  <methodName>examples.getEmployeeName</methodName>
  <params>
    <param>
        <value><i4>40</i4></value>
    </param>
  </params>
</methodCall>

一个对应的XML-RPC相应如下:
<?xml version="1.0"?>
<methodResponse>
  <params>
    <param>
        <value><string>John</string></value>
    </param>
  </params>
</methodResponse>

另外还有XML-RPC错误应答,此处略。

-------------------------------------------------------------------------------

SOAP(Simple Object Access Protocol)
简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议。
它被设计成在 WEB 上交换结构化的和固化的信息,以在应用程序间发送消息。
由于使用了标准的消息描述,它能做到平台独立和语言独立。
SOAP 可以和现存的许多因特网协议和格式结合使用,包括HTTP,SMTP,MIME等,一般使用HTTP/HTTPS。
因此人们一般认为"HTTP + XML = SOAP",与HTTP绑定时,可以使用HTTP POST或HTTP GET方法发送请求。
SOAP可以使用许多不同的消息传递风格,但最常用的是RPC。
SOAP可以看作是TCP/IP体系结构中的应用层协议。事实上它使用了现存的应用层协议作为传输消息的方法。

类似地,DCOM等也可被用于分布式对象访问,但是DCOM往往会被防火墙所过滤。
而SOAP是建立在HTTP等应用层协议上的,一般不会被过滤。

一个典型的SOAP请求如下(获得apple的price,包括HTTP头部):
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body>
   <m:GetPrice xmlns:m="http://www.w3schools.com/prices">
      <m:Item>Apples</m:Item>
   </m:GetPrice>
</soap:Body>

</soap:Envelope>

对应的应答如下(包括HTTP头部):
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body>
   <m:GetPriceResponse xmlns:m="http://www.w3schools.com/prices">
      <m:Price>1.90</m:Price>
   </m:GetPriceResponse>
</soap:Body>

</soap:Envelope>

-------------------------------------------------------------------------------

WSDL(Web Services Description Language)
Web Services Description Language的缩写,是一个用来描述Web Service和说明如何与Web Service通信的XML语言。
注意它本身使用XML语言编写,是一个XML文档,使用了XML Schema来描述网络服务。



有了SOAP后,Web Service提供商还必须向别人提供一套描述自己所提供的SOAP的规范,类似用户手册(manual)
可以把WSDL看作是Web Service的使用说明书。包括接口名称、参数类型等。
然而对于开发人员,无法方便地得到以上信息,因此有必要提供一套解决方案,
以一种统一的、机器能阅读的、人能阅读的描述文档来描述。使用相应的工具可以导入WSDL文档生成调用相应
Web Service的代码,也能根据自己提供的Web Service生成WSDL文档,以供它人使用。


它往往被用于与SOAP,XML Schema结合以在Internet上提供Web Service。

客户端可以通过读取WSDL来得到它能进行什么函数调用,以及可以使用的数据类型。
然后可以使用SOAP来调用WSDL中定义的函数。

WSDL 文档仅仅是一个简单的 XML 文档。
它包含一系列描述某个 web service 的定义。

一个简化的例子,描述了两个消息:

<message name="getTermRequest">
   <part name="term" type="xs:string"/>
</message>

<message name="getTermResponse">
   <part name="value" type="xs:string"/>
</message>

<portType name="glossaryTerms">
  <operation name="getTerm">
      <input message="getTermRequest"/>
      <output message="getTermResponse"/>
  </operation>
</portType>

-------------------------------------------------------------------------------

UDDI(Universal Description, Discovery and Integration)
UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。

在 UDDI 之前,还不存在一种 Internet 标准,可以供企业为它们的企业和伙伴提供有关其产品和服务的信息。
也不存在一种方法,来集成到彼此的系统和进程中。

假如行业发布了一个用于航班比率检测和预订的 UDDI 标准,航空公司就可以把它们的服务注册到一个 UDDI 目录中。
然后旅行社就能够搜索这个 UDDI 目录以找到航空公司预订界面。
当此界面被找到后,旅行社就能够立即与此服务进行通信,这样由于它使用了一套定义良好的预订界面。
这一注册中心与一个电话号码簿非常类似,因为顾客可以通过注册中心查询已经注册Seb services的公司列表。

UDDI用来发布我们提供的web services,当我们写好了一个web services,并且为他建立了WSDL文件,
剩下的事情就是宣传自己,让用户能够找到我们的web services。这个过程有点像电信的"黄页服务(Yellow Paqge)",
企业为了扩展自己的业务,将电话号码登记在黄页上,电信局免费将黄页送给用户,
用户就可以在上面找到自己感兴趣企业的电话。
UDDI就像黄页,如果web services分布在不同的主机上
(比如做为客户端,我们想要的分别访问sohu提供的天气预报服务和sina提供的股票查询服务,
我们没有必要直接去 sohu或者sina的主机上去寻找服务,而是在提供UDDI服务的主机上寻找,
这样,我们的程序就不用直接关联到sohu或者sina,提高了灵活性),那么一个集中管理信息的UDDI则十分重要。

这里有一篇很详细描述UDDI的文章:
http://www.ibm.com/developerworks/cn/webservices/ws-featuddi/index.html


-------------------------------------------------------------------------------

SOA(Service-Oriented Architecture)
看了很多文章,看不懂。
唯一有点感觉的是这篇:
http://se.csai.cn/Monograph/200611141640091038.htm

这里还有很多相关文章:
http://se.csai.cn/zt/SOA/index.asp

No comments: