WSDL结构
1. WSDL概述
WSDL(Web服务描述语言,Web Services Description Language)是为描述Web服务发布的XML格式。WSDL描述Web服务的公共接口。这是一个基于XML的关于如何与Web服务通讯和使用的服务描述;也就是描述与目录中列出的Web服务进行交互时需要绑定的协议和信息格式。
2. WSDL总体结构
wsdl都是由definition、types、message、protType、bingding、service这6个大的节点组成,各个节点之间的关系参考图2。
3. WSDL结构详细介绍
我们以如下WSDL文件骤行解析
1 <?xml version="1.0" encoding="UTF-8"?> 2 <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 3 xmlns:wsp="http://www.w3.org/ns/ws-policy" 4 xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" 5 xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" 6 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 7 xmlns:tns="http://impl.service.webservice.jdk.suns.com/" 8 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 9 xmlns="http://schemas.xmlsoap.org/wsdl/" 10 targetNamespace="http://impl.service.webservice.jdk.suns.com/" name="FlightServiceImplService"> 11 <types> 12 <xsd:schema xmlns:tns="http://impl.service.webservice.jdk.suns.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" 13 version="1.0" targetNamespace="http://impl.service.webservice.jdk.suns.com/"> 14 15 <xs:element name="getFlightInfo" type="tns:getFlightInfo"></xs:element> 16 17 <xs:element name="getFlightInfoResponse" type="tns:getFlightInfoResponse"></xs:element> 18 19 <xs:complexType name="getFlightInfo"> 20 <xs:sequence> 21 <xs:element name="arg0" type="xs:string" minOccurs="0"></xs:element> 22 <xs:element name="arg1" type="xs:dateTime" minOccurs="0"></xs:element> 23 </xs:sequence> 24 </xs:complexType> 25 26 <xs:complexType name="getFlightInfoResponse"> 27 <xs:sequence> 28 <xs:element name="return" type="tns:flightInfo" minOccurs="0" maxOccurs="unbounded"></xs:element> 29 </xs:sequence> 30 </xs:complexType> 31 32 <xs:complexType name="flightInfo"> 33 <xs:sequence> 34 <xs:element name="airlineICAO" type="xs:string" minOccurs="0"></xs:element> 35 <xs:element name="fligtDate" type="xs:dateTime" minOccurs="0"></xs:element> 36 <xs:element name="fligtDirectCd" type="xs:string" minOccurs="0"></xs:element> 37 <xs:element name="fligtNo" type="xs:string" minOccurs="0"></xs:element> 38 </xs:sequence> 39 </xs:complexType> 40 </xsd:schema> 41 </types> 42 <message name="getFlightInfo"> 43 <part name="parameters" element="tns:getFlightInfo"></part> 44 </message> 45 <message name="getFlightInfoResponse"> 46 <part name="parameters" element="tns:getFlightInfoResponse"></part> 47 </message> 48 <portType name="FlightServiceImpl"> 49 <operation name="getFlightInfo"> 50 <input wsam:Action="http://impl.service.webservice.jdk.suns.com/FlightServiceImpl/getFlightInfoRequest" 51 message="tns:getFlightInfo"></input> 52 <output wsam:Action="http://impl.service.webservice.jdk.suns.com/FlightServiceImpl/getFlightInfoResponse" 53 message="tns:getFlightInfoResponse"></output> 54 </operation> 55 </portType> 56 <binding name="FlightServiceImplPortBinding" type="tns:FlightServiceImpl"> 57 <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding> 58 <operation name="getFlightInfo"> 59 <soap:operation soapAction=""></soap:operation> 60 <input> 61 <soap:body use="literal"></soap:body> 62 </input> 63 <output> 64 <soap:body use="literal"></soap:body> 65 </output> 66 </operation> 67 </binding> 68 <service name="FlightServiceImplService"> 69 <port name="FlightServiceImplPort" binding="tns:FlightServiceImplPortBinding"> 70 <soap:address location="http://127.0.0.1:8080/webService/flightService"></soap:address> 71 </port> 72 </service> 73 </definitions>
3.1 第1行:
<?xml version="1.0" encoding="UTF-8"?>
version="1.0" 声明用的xml版本是1.0
encoding="UTF-8" 声明用xml传输数据的时候的字符编码,假如文档里面有中文,编码方式不是UTF-8,传输过去再解码的话中文就会是乱码
3.2 2-10行:definitions节点
1 <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 2 xmlns:wsp="http://www.w3.org/ns/ws-policy" 3 xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" 4 xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" 5 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 6 xmlns:tns="http://impl.service.webservice.jdk.suns.com/" 7 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 8 xmlns="http://schemas.xmlsoap.org/wsdl/" 9 targetNamespace="http://impl.service.webservice.jdk.suns.com/" name="FlightServiceImplService">
- targetNamespace属性值来定义当前schema的命名空间,所谓命名空间可以理解为唯一识别id,它的值经常会设置成一个url(这个url地址不一定能访问)
- 通过xmlns属性来引入其他schema,xmlns值就是其他schema的targetNameSpace。比如当前schema命名空间为http://impl.service.webservice.jdk.suns.com/,通过xmlns:tns来引入自身,并取了别名为tns
- 别名:而xmlns后面是命名空间的别名,使用别名的作用是防止不同schema中有相同的element。比如有个elementTypeTest节点同时存在wsu、wsp命名空间,我们可以通过wsu:elementTypeTest来指定使用wsu命名空间中的elementTypeTest
3.3 11-41行:types节点
1 <types> 2 <xsd:schema xmlns:tns="http://impl.service.webservice.jdk.suns.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" 3 version="1.0" targetNamespace="http://impl.service.webservice.jdk.suns.com/"> 4 5 <xs:element name="getFlightInfo" type="tns:getFlightInfo"></xs:element> 6 7 <xs:element name="getFlightInfoResponse" type="tns:getFlightInfoResponse"></xs:element> 8 9 <xs:complexType name="getFlightInfo"> 10 <xs:sequence> 11 <xs:element name="arg0" type="xs:string" minOccurs="0"></xs:element> 12 <xs:element name="arg1" type="xs:dateTime" minOccurs="0"></xs:element> 13 </xs:sequence> 14 </xs:complexType> 15 16 <xs:complexType name="getFlightInfoResponse"> 17 <xs:sequence> 18 <xs:element name="return" type="tns:flightInfo" minOccurs="0" maxOccurs="unbounded"></xs:element> 19 </xs:sequence> 20 </xs:complexType> 21 22 <xs:complexType name="flightInfo"> 23 <xs:sequence> 24 <xs:element name="airlineICAO" type="xs:string" minOccurs="0"></xs:element> 25 <xs:element name="fligtDate" type="xs:dateTime" minOccurs="0"></xs:element> 26 <xs:element name="fligtDirectCd" type="xs:string" minOccurs="0"></xs:element> 27 <xs:element name="fligtNo" type="xs:string" minOccurs="0"></xs:element> 28 </xs:sequence> 29 </xs:complexType> 30 </xsd:schema> 31 </types>
Types元素用作一个容器,定义了自定义的特殊数据结构。在Types的schema中定义了2个复合元素:getFlightInfo和getFlightInfoResponse
getFlightInfo元素:第5行getFlightInfo元素的数据类型通过type属性指定,而type属性值指向了schema中第9行getFlightInfo复合类型,该复合类型有2个String类型元素arg0、arg1,最终可以知道第5行getFlightInfo元素的数据结构为如下:
<getFlightInfo> <arg0>String<arg0> <arg1>String<arg1> </getFlightInfo>
getFlightInfoResponse元素:第7行getFlightInfoResponse元素的数据类型通过type属性指定,而type属性值指向了schema中第16行getFlightInfoResponse复合类型,该复合类型有个元素return,return元素的类型通过type属性指向第22行的flightInfo复合类型,flightInfo有4个String类型的元素,分别为airlineICAO、flightDate、flightDirectCd、flightNo,最终可以知道第7行getFlightInfoResponse元素的数据结构如下:
<getFlightInfoResponse> <return> <airlineICAO>String</airlineICAO> <flightDate>String</flightDate> <flightDirectCd></flightDirectCd> <flightNO>String</flightNO> </return> </getFlightInfoResponse>
3.4 import节点
import元素使得可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的定义元素。本例子中没有使用import元素。通常在用户希望模块化WSDL文档的时候,该功能是非常有效果的。
import的格式如下:
<wsdl:import namespace="http://xxx.xxx.xxx/xxx/xxx" location="http://xxx.xxx.xxx/xxx/xxx.wsdl"/>
必须有namespace属性和location属性:
- namespace属性:值必须与正导入的WSDL文档中声明的targetNamespace相匹配;
- location属性:必须指向一个实际的WSDL文档,并且该文档不能为空。
3.5 42-47行:message节点
1 <message name="getFlightInfo"> 2 <part name="parameters" element="tns:getFlightInfo"></part> 3 </message> 4 <message name="getFlightInfoResponse"> 5 <part name="parameters" element="tns:getFlightInfoResponse"></part> 6 </message>
message表示web service输入消息和返回消息,其中part节点引用types中定义的数据结构,这里message:getFlightInfo就是types中getFlightInfo数据结构。
3.6 48-55行:portType节点
1 <portType name="FlightServiceImpl"> 2 <operation name="getFlightInfo"> 3 <input wsam:Action="http://impl.service.webservice.jdk.suns.com/FlightServiceImpl/getFlightInfoRequest" 4 message="tns:getFlightInfo"></input> 5 <output wsam:Action="http://impl.service.webservice.jdk.suns.com/FlightServiceImpl/getFlightInfoResponse" 6 message="tns:getFlightInfoResponse"></output> 7 </operation> 8 </portType>
portType元素定义了Web服务的抽象接口。该接口有点类似Java的接口,都是定义了一个抽象类型和方法,没有定义实现。在WSDL中,portType元素是由binding和service元素来实现的,这两个元素用来说明Web服务实现使用的Internet协议、编码方案以及Internet地址。
一个portType中可以定义多个operation,一个operation可以看作是服务端处理请求的方法
input: 指定客户端传给服务端的数据,通过message属性来引用上面定义<message>
output: 指定服务器端返回给客户端的数据, 通过message属性来引用上面定义<message>
3.6 56-67行:binding节点
1 <binding name="FlightServiceImplPortBinding" type="tns:FlightServiceImpl"> 2 <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding> 3 <operation name="getFlightInfo"> 4 <soap:operation soapAction=""></soap:operation> 5 <input> 6 <soap:body use="literal"></soap:body> 7 </input> 8 <output> 9 <soap:body use="literal"></soap:body> 10 </output> 11 </operation> 12 </binding>
portType元素定义了Web服务的抽象接口,binding则为Web服务的具体实现。binding元素将一个抽象portType映射到一组具体协议(SOAO和HTTP)、消息传递样式、编码样式。
type属性:引用上面的<portType>
soap:binding:元素指定了用于传输SOAP消息的Internet协议(这里是http)以及operation缺省的消息类型(这里是document,其实就是XML)
operation:用来定义实现的方法,也就是后台具体处理客户端请求的方法。
input: 指定客户端应用传过来的数据,literal表示文本数据
output: 指定服务器端返回给客户端的数据, literal表示文本数据
3.7 68-72行:service节点
1 <service name="FlightServiceImplService"> 2 <port name="FlightServiceImplPort" binding="tns:FlightServiceImplPortBinding"> 3 <soap:address location="http://127.0.0.1:8080/webService/flightService"></soap:address> 4 </port> 5 </service>
service相关服务访问点的集合,集合中包含一个或者多个port元素,其中每个port元素表示一个不同的Web服务。port元素将URL赋给一个特定的binding,甚至可以使两个或者多个port元素将不同的URL赋值给相同的binding。
第1行name属性:在封闭的WSDL文档中提供唯一名称
port:用来指定一个服务器端处理请求的入口
binding属性:引用上面定义的<bingding>标签
address:当前webservice的请求地址