概述
当前,Web Service技术可谓炙手可热,即使MS宣布放弃Web Service。在没有更好技术标准出现之前,Web Service技术仍是企业级应用集成的基础,也是支撑SOA的构建技术之一。本文试图从一个比较高的角度来分析和概述一下Web Service的核心技术。
Web Service与其说是软件技术发展的进步,不如说是商业和政治上的策略。看看COBRA的推广和接受程度,COM/DCOM组件、J2EE等软件技术的成功,我们有理由相信,无论在技术上,还是商业营销上,软件产业都需要一次概念上的更新。WWW/HTTP的巨大成功和XML的广泛应用给软件业带来了很大的启发,Web Service借助WWW/HTTP和XML的袈裟横空出世,进入企业开发的概念之列,成为程序员的必修技术。
Web Service本质上是一种分布式软件的耦合交互技术,其主要目标是实现跨平台的可互操作性。所谓耦合交互,就是让分布式软件的两端在某种协议下能够交互,而不用关心彼此使用的编程技术。当然,不管这个协议叫RPC(远程过程调用)还是服务(services),我们都可以理解为一种操作。
核心技术
Web Service的核心技术主要有:XML/XML Schema,SOAP,WSDL,UDDI,HTTP。
Web Service使用XML/XSD(可扩展标记语言/ XML Schema )描述数据结构及类型,XML实例易于建立和易于分析,其主要的优点在于平台无关性和厂商无关性。
Web Service使用SOAP表示信息传输协议, SOAP基于XML/XSD,独立于平台和编程语言。
Web Service使用WSDL描述web服务,WSDL基于XML。
Web Service使用UDDI (Universal Description, Discovery and Integration)描述、发现与集成web服务。
概念模型
Web Service概念模型
SOAP
软件就是接受输入数据,处理数据,然后输出结果的过程,分布式软件也不例外。为了实现分布式软件的交换,需要一种协议保证输入数据和输出数据的格式是彼此可理解的,并且与具体的编程语言无关,而SOAP(simple object access protocol)就是规定如何用XML来格式化输入数据和格式化输出结果的协议。Web Service 中将这种格式化后的数据称作SOAP消息(message)。
SOAP特性
l SOAP是一种基于XML的标准消息传输协议,其消息格式由XML Schema模式定义,通过XML命名空间使SOAP具有很强的扩展性。
l SOAP中根元素是Envelope元素。Envelope元素中可以包含多个可选的Header元素,必须同时包含一个Body元素。Header元素必须是Envelope元素的直接子元素,并且要位于Body元素之前 。
l SOAP的命名空间:xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/,命名空间定义了标准SOAP元素(如:Envelope, Header和Body等)。
l SOAP支持四种消息传输模式(RPC/Literal, Document/ Literal, RPC/Encoded, and Document/Encoded),但是WS-I Basic Pro
l Document/Literal Unwrapped(非包装的文档/明文)模式,如果参数为soap:Body的直接子元素,则为该模式。
l Document/Literal Wrapped(包装的文档/明文)模式,参数包装在一个“wrapper”元素中,“wrapper”元素为soap:Body的直接子元素。
Web Service交互过程
传输模式的例子
1.Document/Literal Unwrapped的SOAP请求消息例子:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Body xmlns:getord="http://www.example.com/oms/getorders">
<getord:startDate>2005-11-19</getord:startDate>
<getord:endDate>2005-11-22</getord:endDate>
</env:Body>
</env:Envelope>
2.Document/Literal Wrapped的SOAP请求消息例子:
<env1:Envelope xmlns:env1="http://schemas.xmlsoap.org/soap/envelope/">
<env1:Body>
<getord:getOrdersDates xmlns:getord="http://www.example.com/oms/getorders">
<getord:startDate>2005-11-19</getord:startDate>
<getord:endDate>2005-11-22</getord:endDate>
</getord:getOrdersDates>
</env1:Body>