日期:2012-10-08  浏览次数:20645 次

Web Service随笔。

1 为什么出现Web Service?

现在Internet的发展十分迅速,它从前的框架是“人来获取网络上的资源,比如:程序、文档等”。也就是说,现在的Web是以人为中心的,人来发送各种请求。而它的发展趋势将是主体从“人”转向“程序”,比如媒体播放器、浏览器等,也就是说“以应用程序中心”的Web。其实,在Web Service出现之前,人们就已经在做这方面的事情了,例如Java的Servlet和CGI,但是不同的程序系统采用了不同的数据定义,所以这些系统之间的交互变得异常地复杂。Web Service的出现,就是为了解决了不同应用程序之间通信的格式问题。

2 Web Service的通信方式?

XML通信有几种不同的方法,例如:XML Remote Procedure Calls (XML-RPC),SOAP或HTTP GET/POST。

3 Web Service的属性。

Web Service是在Internet上任何可用的服务,它是通过标准化的XML通信(XML Messaging)来实现的,并且不依赖于任何平台和任何编程语言。

尽管不是必须的,但Web Service可能会有其他两个属性:

A)可自描述的(self-describing).如果你编写Web Service,你应该发布Web Service的公共接口,至少有一个基于自然语言的文档。这样,别的开发者才能轻松地整合你的服务。

B)可发现的(discoverable).其他和你的Web Service有关的程序(可能是分散的,也可能是集中的系统)能够找到它。

4 Web Service 的架构

Web Service有两种架构,一种是讨论Web Service每个功能角色(role),另一种是讨论Web Service的协议层(protocol stack)。

就前者而言,Web Service有三个角色:服务提供者,服务请求者和服务注册机构。服务请求者从服务注册机构获得服务提供者,然后向服务提供者发出提供服务的请求。


就后者而言,Web Service有四层:服务传输层(Service transport)、XML通信层(XML messaging)、服务描述层(Service description)和服务发现层(Service discovery)。

A) 服务传输层:负责信息在应用程序之间的传送。现在包括HTTP、FTP、SMTP和较新的如BEEP等协议。

就现在而言,由于HTTP比较简单、稳定以及被广泛应用,而且大部分防火墙对HTTP协议的80端口是开放的,所以HTTP是服务运输层的最流行的协议。当然它会有一些安全上的隐患,因为HTTP协议的设计并不能满足Web Service的安全性。

SOAP是不依赖于具体协议的,除了HTTP协议,它还可以通过FTP、SMTP等传输,比较有前途的是BEEP(Blocks Extensible Exchange Protocol)协议。BEEP协议属于TCP,它较HTTP的优势在于:除了TCP公共的握手外,它每次所带的报文头只需30个字节。

B) XML通信层:负责用通用的XML格式对信息进行编码。现在包括XML-RPC和 SOAP.

C) 服务描述层:负责用WSDL将公共接口向特定的Web Service描述。

D) 服务发现层:负责将服务集中到公共注册机构,并且提供Web Service发布和寻找功能,现在服务发现是通过UDDI来实现的(Universal Description, Discovery, and Integration

)。

可见,Web Service采用可类似网络分层的结构,使各个层次的功能互补干扰,同时又能很好的互相合作。当然,随着Web Service的不断发展,可能会出现新的层次。


我们可以看一下IBM的演示:

http://awwebx04.alphaworks.ibm.com/ettk/demos/wstkdoc/README.htm

我到微软注册了UDDI:http://uddi.microsoft.com

接下来看一下XML请求

下面是一段JAVA的SOAP调用:

Soap Request:

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://www.w3.org/2001/09/soap-envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:getWeather
xmlns:ns1="urn:examples:weatherservice"
SOAP-ENV:encodingStyle="http://www.w3.org/2001/09/soap-encoding/">
<zipcode xsi:type="xsd:string">10016</zipcode>
</ns1:getWeather>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


SOAP Response:

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://www.w3.org/2001/09/soap-envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:getWeatherResponse
xmlns:ns1="urn:examples:weatherservice"
SOAP-ENV:encodingStyle="http://www.w3.org/2001/09/soap-encoding/">
<return xsi:type="xsd:int">65</return>
</ns1:getWeatherResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
而下面是.Net调用的SOAP

Soap Request:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Add xmlns="http://tempuri.org/">
<a>24</a>
<b>12</b>
</Add>
</soap:Body>
</soap:Envelope>


SOAP Response:


<?xml version="1.0" encoding="utf-8"?>
<