Web Service并不是一个新的概念,由于早期带宽与存储容量的限制,令它并不被人关注。但是随着带宽与存储容量已经不会构成问题了之后,Web Service逐渐成为了分布式应用中的首选。
Web Service的使用一个标准的输出接口来定义代码提供的功能,以便让外界可以通过这个标准的输出接口来调用,而所谓的标准输出接口就是WSDL。
通过Web Service,可以实现不同系统间的交互功能。
Web Service根据我的理解就是一个可以远程调用的类,或者说是组件。
要想进一步理解Web Service,就要理解Web Service所涉及的一些概念:WSDL、WSDD、SOAP。
在传统的分布式系统中,会提供一种语言来描述server端提供的接口信息(如COBAR中的IDL语言)。同样的,Web Service平台也必须提供一种标准来描述Web Service,让客户可以得到足够的信息来调用这个Web Service。
可扩展的标记语言(XML)是Web Service平台中表示数据的基本格式。但这只是基础,你还需要向别人描述你提供的接口,WSDL就是这样一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。利用Eclipse这样的开发工具可以根据你的Web Service生成WSDL文档,也可以导入WSDL文档,生成相应Web Service的代码。 而且绝大多数的Web Service框架都支持通过WSDL自动生成client代码,并不需要我们自己去编写。
编写好了接口,我们就需要将接口部署到服务器上,Web Service有两种部署方式,而其中一种就需要WSDD文件来告诉容器怎么管理这个服务。
Web Service创建好之后,我们就需要去调用它了,既然是远程调用,那么我们就要选择一个RPC(远程过程调用协议)协议去调用它了,SOAP(简单对象访问协议)提供了标准的RPC方法来调用Web Service。
WSDL是基于XML的,Web Service的描述语言,是一种接口定义语言,用于描述Web Service的接口信息等。
一个WSDL文档通常包含7个重要的元素,即types、import、message、portType、operation、binding、 service元素。
这些元素嵌套在definitions元素中,definitions是WSDL文档的根元素。每个元素在WSDL文档中都对应了一个标签,如:<wsdl:definitions>、<wsdl:types>等等。
各个元素的作用(这里直接使用WSDL中的标签表示):
<wsdl:types>(消息类型):数据类型定义的容器,它使用某种类型系统(如XSD)。实际上就是对这个WSDL文件(本质上是个XML)的Schema约束。可以理解为返回对象中的各个属性的类型。
<wsdl:message>(消息):通信数据的抽象类型化定义,它由一个或者多个<wsdl:part>组成。使用<wsdl:types>所定义的类型来定义整个消息的数据结构。可以理解为传入或返回的各种对象。
<wsdl:part>(消息参数):可以理解为返回对象中的各种字段属性。
<wsdl:portType>(端口类型):特定端口类型的具体协议和数据格式规范。可以理解为一类操作的分组,也就是说是若干个方法的分组,即接口。由若干个<wsdl:operation>组成。
<wsdl:binding>:特定端口类型的具体协议和数据格式规范。binding元素将一个抽象portType映射到一组具体协议(SOAP和HTTP)、消息传递样式、编码样式。通常binding元素与协议专有的元素和在一起使用。一般会指定type为<wsdl:portType>。也由若干个<wsdl:operation>组成。
<wsdl:operation>(操作):对服务所支持的操作进行抽象描述,WSDL定义了四种操作: 1.单向(one-way):端点接受信息;2.请求-响应(request-response):端点接受消息,然后发送相关消息;3.要求-响应(solicit-response):端点发送消息,然后接受相关消息;4.通知(notification[2]):端点发送消息。
<wsdl:input>:输入类型。
<wsdl:output>:输出类型。
<wsdl:fault>:错误类型。
<wsdl:service>:相关端口的集合,包括其关联的接口、操作、消息等。
<wsdl:port>:定义为绑定和网络地址组合的单个端点。一般嵌套<wsdlsoap:address>来指定Web Service的地址。
<wsdl:import>:import元素使得可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的定义元素。
通常在用户希望模块化WSDL文档的时候,该功能是非常有效果的。
Web Service的发布分为两种:
即时发布 JWS (Java Web Service)
即时发布非常简单,只需要把java类拷贝到axis(这个是什么下篇文章再谈,可以理解为Web Service的框架)的目录下即可。但是却是以牺牲灵活为代价的,因为即时发布不支持带包名的类,所以基本使用的很少。
定制发布 Custom Deployment - Introducing WSDD(Web Service Deployment Descriptor)
定制发布非常复杂,但是有非常大的灵活性,需要自己编写WSDD(部署描述文件)。
通过编写Web Service服务类、部署到服务器、发布Web Service之后,我们的Web Service服务端就算是完成了。之后再通过不同的发布方式来编写对应的客户端代码,就可以调用Web Service了。