WebService中的WSDL详细解析
WebService中的WSDL详解
有⼈在WebService开发的时候,特别是和第三⽅有接⼝的时候,⾛的是SOAP协议,然后⽤户(或后台)给你⼀个WSDL⽂件(或⽹址),说按照上⾯的进⾏适配, 这时就要对WebService的WSDL有⼀定的理解,本⽂将对WSDL(WebService描述语⾔)进⾏详细总结。
WSDL (Web Services Description Language,Web服务描述语⾔)是⼀种XML Application,他将Web服务描述定义为⼀组服务访问点,客户端可以通过这些服务访问点对包含⾯向⽂档信息或⾯向过程调⽤的服务进⾏访问(类似远程过程调⽤)。WSDL⾸先对访问的操作和访问时使⽤的请求/响应消息进⾏抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服务访问点。相关的具体部署的服务访问点通过组合就成为抽象的Web服务。
⼀.WSDL的基本概念
WSDL是⼀个⽤于精确描述Web服务的⽂档,WSDL⽂档是⼀个遵循WSDL-XML模式的XML⽂档。WSDL ⽂档将Web服务定义为服务访问点或端⼝的集合。在 WSDL 中,由于服务访问点和消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来,因此可以对抽象定义进⾏再次使⽤。消息,指对交
换数据的抽象描述;⽽端⼝类型,指操作的抽象集合。⽤于特定端⼝类型的具体协议和数据格式规范构成了可以再次使⽤的绑定。将Web访问地址与可再次使⽤的绑定相关联,可以定义⼀个端⼝,⽽端⼝的集合则定义为服务。
⼀个WSDL⽂档通常包含8个重要的元素,即definitions、types、import、message、portType、operation、binding、service 元素。这些元素嵌套在definitions元素中,definitions是WSDL⽂档的根元素。
WSDL⽂档外层结构图⽰:
WSDL 服务进⾏交互的基本元素:
Types(消息类型):数据类型定义的容器,它使⽤某种类型系统(如 XSD)。
Message(消息):通信数据的抽象类型化定义,它由⼀个或者多个 part 组成。
Part:消息参数
PortType(端⼝类型):特定端⼝类型的具体协议和数据格式规范。,它由⼀个或者多个 Operation组成。
Operation(操作):对服务所⽀持的操作进⾏抽象描述,WSDL定义了四种操作:
1.单向(one-way):端点接受信息;
3.要求-响应(solicit-response):端点发送消息,然后接受相关消息;
4.通知(notification[2] ):端点发送消息。
Binding:特定端⼝类型的具体协议和数据格式规范。
Port:定义为绑定和⽹络地址组合的单个端点。
Service:相关端⼝的集合,包括其关联的接⼝、操作、消息等。
外层结构⾥⾯也可能有多层结构。
⼆.WSDL的基本结构详解
下⾯通过⼀份wsdl⽂档,来详细解读WSDL结构:
1. <?xml version="1.0" encoding="UTF-8" ?>
2. <wsdl:definitions
3. targetNamespace="com.liuxiang.xfireDemo/HelloService"
4. xmlns:tns="com.liuxiang.xfireDemo/HelloService"
5. xmlns:wsdlsoap="/wsdl/soap/"
6. xmlns:soap12="/2003/05/soap-envelope"
7. xmlns:xsd="/2001/XMLSchema"
8. xmlns:soapenc11="/soap/encoding/"
9. xmlns:soapenc12="/2003/05/soap-encoding"
0. xmlns:soap11="/soap/envelope/"
1. xmlns:wsdl="/wsdl/">
2. <wsdl:types>
3. <xsd:schema xmlns:xsd="/2001/XMLSchema"
4. attributeFormDefault="qualified" elementFormDefault="qualified"
5. targetNamespace="com.liuxiang.xfireDemo/HelloService">
6. <xsd:element name="sayHello">
7. <xsd:complexType>
8. <xsd:sequence>
9. <xsd:element maxOccurs="1" minOccurs="1"
0. name="name" nillable="true" type="xsd:string" />
1. </xsd:sequence>
2. </xsd:complexType>
3. </xsd:element>
4. <xsd:element name="sayHelloResponse">
5. <xsd:complexType>
6. <xsd:sequence>
7. <xsd:element maxOccurs="1" minOccurs="0"
8. name="return" nillable="true" type="xsd:string" />
9. </xsd:sequence>
0. </xsd:complexType>
1. </xsd:element>
2. </xsd:schema>
3. </wsdl:types>
4. <wsdl:message name="sayHelloResponse">
5. <wsdl:part name="parameters" element="tns:sayHelloResponse" />
6. </wsdl:message>
7. <wsdl:message name="sayHelloRequest">
8. <wsdl:part name="parameters" element="tns:sayHello" />
9. </wsdl:message>
0. <wsdl:portType name="HelloServicePortType">
1. <wsdl:operation name="sayHello">
2. <wsdl:input name="sayHelloRequest"
3. message="tns:sayHelloRequest" />
4. <wsdl:output name="sayHelloResponse"
5. message="tns:sayHelloResponse" />
6. </wsdl:operation>
7. </wsdl:portType>
8. <wsdl:binding name="HelloServiceHttpBinding"
9. type="tns:HelloServicePortType">
0. <wsdlsoap:binding
1. transport="/soap/http" />
2. <wsdl:operation name="sayHello">
3. <wsdlsoap:operation soapAction="" />
4. <wsdl:input name="sayHelloRequest">
5. <wsdlsoap:body use="literal" />
6. </wsdl:input>
7. <wsdl:output name="sayHelloResponse">
8. <wsdlsoap:body use="literal" />
9. </wsdl:output>
0. </wsdl:operation>
1. </wsdl:binding>
2. <wsdl:service name="HelloService">
3. <wsdl:port name="HelloServiceHttpPort"
4. binding="tns:HelloServiceHttpBinding">
5. <wsdlsoap:address
6. location="localhost:8080/xfire/services/HelloService" />
7. </wsdl:port>
8. </wsdl:service>
9. </wsdl:definitions>
(⼀) definitions元素
所有的WSDL⽂档的根元素均是definitions元素。该元素封装了整个⽂档,同时通过其name提供了⼀个WSDL⽂档。除了提供⼀个命名空间(targetNamespace)外,该元素没有其他作⽤,故不作详细描述。
(⼆)types元素
WSDL采⽤了W3C XML模式内置类型作为其基本类型系统。types元素⽤作⼀个容器,⽤于定义XML
模式内置类型中没有描述的各种数据类型(不太明⽩:XML模式内置类型中没有描述的各种数据类型)。当声明消息部分的有效时,消息定义使⽤了在types元素中定义的数据类型和元素。在本⽂的WSDL⽂档中的types定义:
1. <wsdl:types>
2. <xsd:schema xmlns:xsd="www.w
2001/XMLSchema"
3. attributeFormDefault="qualified" elementFormDefault="qualified"
4. targetNamespace="com.liuxiang.xfireDemo/HelloService">
5. <xsd:element name="sayHello">
6. <xsd:complexType>
7. <xsd:sequence>
8. <xsd:element maxOccurs="1" minOccurs="1"
9. name="name" nillable="true" type="xsd:string" />
0. </xsd:sequence>
1. </xsd:complexType>
2. </xsd:element>
3. <xsd:element name="sayHelloResponse">
4. <xsd:complexType>
5. <xsd:sequence>
6. <xsd:element maxOccurs="1" minOccurs="0"
7. name="return" nillable="true" type="xsd:string" />
8. </xsd:sequence>
9. </xsd:complexType>
调用webservice服务0. </xsd:element>
1. </xsd:schema>
2. </wsdl:types>
上⾯是数据定义部分,该部分定义了两个元素,⼀个是sayHello,⼀个是sayHelloResponse:
sayHello:定义了⼀个复杂类型,仅仅包含⼀个简单的字符串,将来⽤来描述操作的参⼊传⼊部分;
sayHelloResponse:定义了⼀个复杂类型,仅仅包含⼀个简单的字符串,将来⽤来描述操作的返回值;
这⾥sayHelloResponse是和sayHello相关的,sayHello相对于⼀个⽅法,⾥⾯的: type=”xsd:string”,name=”name”,是确定传⼊name的参数是String类型的,⽽sayHelloResponse中的 name=”return” type=”xsd:string” 是确定⽅法
sayHello(String name)返回的类型是String类型的。
(三)import元素
import元素使得可以在当前的WSDL⽂档中使⽤其他WSDL⽂档中指定的命名空间中的定义元素。本例⼦中没有使⽤import元素。通常在⽤户希望模块化WSDL⽂档的时候,该功能是⾮常有效果的。
import的格式如下:
<wsdl:import namespace="/xxx/xxx" location="/xxx/xxx.wsdl"/>
必须有namespace属性和location属性:
1.namespace属性:值必须与正导⼊的WSDL⽂档中声明的targetNamespace相匹配;
2.location属性:必须指向⼀个实际的WSDL⽂档,并且该⽂档不能为空。
(四)message元素
message元素描述了Web服务使⽤消息的有效负载。message元素可以描述输出或者接受消息的有效负载;还可以描述SOAP⽂件头和错误detail元素的内容。定义message元素的⽅式取决于使⽤RPC样式还是⽂档样式的消息传递。在本⽂中的message元素的定义,本⽂档使⽤了采⽤⽂档样式的消息传递:
1. <wsdl:message name="sayHelloResponse">
2. <wsdl:part name="parameters" element="tns:sayHelloResponse" />
3. </wsdl:message>
4. <wsdl:message name="sayHelloRequest">
5. <wsdl:part name="parameters" element="tns:sayHello" />
6. </wsdl:message>
1
该部分是消息格式的抽象定义:定义了两个消息sayHelloResponse和sayHelloRequest:
1.sayHelloRequest:
sayHello操作的请求消息格式,由⼀个消息⽚断组成,名字为parameters,元素是我们前⾯定义的types中的元素;
2.sayHelloResponse:
sayHello操作的响应消息格式,由⼀个消息⽚断组成,名字为parameters,元素是我们前⾯定义的types中的元素;
如果采⽤RPC样式的消息传递,只需要将⽂档中的element元素修改为type即可(??)。
(五)portType元素
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论