1.什么是WSDL
是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操作(或方法)。
2.WSDL文档结构:
<binding> | web service 使用的通信协议;为每一个<protTypes>定义消息格式和通信协议;有services引用; |
<portType> | web service 可以执行的操作(operation)相当于一个函数库,其中定义的每一个操作可以被看做是一个函数;被binding调用; |
<message> | web service 使用的消息;被operation调用,相当于函数的参数,有入参(input)和出参(output);message中的part,指定函数中的参数名和参数类型; |
<types> | web service 使用的数据类型;被<message>调用;在<types>中定义了元素以及元素的类型; |
以GetServices为例
////////////////////////////////<types>
<wsdl:types> <xs:schema targetNamespace="http://www.onvif.org/ver10/device/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" elementFormDefault="qualified" version="18.12"> <xs:import namespace="http://www.onvif.org/ver10/schema" schemaLocation="../../../ver10/schema/onvif.xsd"/> <!--===============================--> <xs:element name="GetServices"> <xs:complexType> <xs:sequence> <xs:element name="IncludeCapability" type="xs:boolean"> <xs:annotation> <xs:documentation>Indicates if the service capabilities (untyped) should be included in the response.</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="GetServicesResponse"> <xs:complexType> <xs:sequence> <xs:element name="Service" type="tds:Service" maxOccurs="unbounded"> //这里需要注意的是,"type= "tds:Service""指定的类型是下面的complexTpye name = "Service" <xs:annotation> <xs:documentation>Each Service element contains information about one service.</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <!--===============================--> <xs:complexType name="Service"> //自定义一种复杂的数据类型 “Service”,请求消息或者响应消息时需要严格按照数据类型格式; <xs:sequence> <xs:element name="Namespace" type="xs:anyURI"> //这里的“anyURL”是xml schmea中的杂项数据类型,表示Namespace元素值可以是任意类型的URI; <xs:annotation> <xs:documentation>Namespace of the service being described.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="XAddr" type="xs:anyURI"> <xs:annotation> <xs:documentation>The transport addresses where the service can be reached.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="Capabilities" minOccurs="0"> //表示<Capabilities>元素最少可以出现0次;如果不明确声明出现的次数,则元素最少出现一次,最多出现一次 <xs:complexType> <xs:sequence> <xs:any namespace="##any" processContents="lax"> <xs:annotation> <xs:documentation>The placeholder for the service capabilities.</xs:documentation> </xs:annotation> </xs:any> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Version" type="tt:OnvifVersion"> <xs:annotation> <xs:documentation>The version of the service (not the ONVIF core spec version).</xs:documentation> </xs:annotation> </xs:element> <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> //<any> 元素使我们有能力可以使用未被 schema 规定的元素来拓展 XML 文档! </xs:sequence> <xs:anyAttribute processContents="lax"/> //<anyAttribute> 元素使我们有能力使用未被 schema 规定的属性来扩展 XML 文档! </xs:complexType> </wsdl:types> ///////////////////////////////<message> <wsdl:message name="GetServicesRequest"> <wsdl:part name="parameters" element="tds:GetServices"/> //把massage定义了操作的参数:part则是定义的参数; </wsdl:message> <wsdl:message name="GetServicesResponse"> <wsdl:part name="parameters" element="tds:GetServicesResponse"/> </wsdl:message> ///////////////////////////////<portType> <wsdl:portType name="Device"> <wsdl:operation name="GetServices"> <wsdl:documentation>Returns information about services on the device.</wsdl:documentation> <wsdl:input message="tds:GetServicesRequest"/> <wsdl:output message="tds:GetServicesResponse"/> </wsdl:operation> </wsdl:portType> ////////////////////////////////<binding> <wsdl:binding name="DeviceBinding" type="tds:Device"> //指向binding的端口,此处指向“Device”; <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> //style取值只能为“rpc”或者“document”;transport定义了要使用的SOAP协议,这里使用http; <wsdl:operation name="GetServices"> <soap:operation soapAction="http://www.onvif.org/ver10/device/wsdl/GetServices"/> //定义了每个端口提供的操作符; <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding>
下图概要描述了<binding>,<message>,<types>,<portTypes>之间的关系
1.箭头连接符代表文档不同栏之间的关系。
2.点和箭头代表了引用或使用关系。
3.双箭头代表"修改"关系。
4.3-D的箭头代表了包含关系。
这样,
各Messages栏使用Types栏的定义;
PortTypes栏使用Messages栏的定义;
Bindings栏引用了PortTypes栏;
Services栏引用Bindings栏;
PortTypes和Bindings栏包含了operation元素,而Services栏包含了port元素。
PortTypes栏里的operation元素由Bindings栏里的operation元素进一步修改或描述。