WSDL
概述
WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似远程过程调用)。WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服务访问点。相关的具体部署的服务访问点通过组合就成为抽象的Web服务。
一个WSDL文档的根元素是definitions元素,WSDL文档包含7个重要的元素:types, import, message, portType, operations, binding和service元素。这些元素都位于命名空间”http://schemas.xmlsoap.org/wsdl/" 中。
抽象接口与具体实现
message、portType和operation元素用于描述WSDL的抽象接口
message、portType和operation元素用于描述Web服务的抽象接口,相当于JAVA或者C++中编程中的类的接口。其中portType相当于类接口的名称;operation相当于接口中包含的函数;message相当于函数的参数和返回值。
以上三种结构描述了调用Web服务的抽象定义,这三部分与具体Web服务部署细节无关,是可复用的描述(每个层次都可以复用)。如果与一般的对象语言做比较的话,这部分可以堪称是IDL描述的对象,描述了对象的接口标准,但是到底对象是用哪种语言实现,遵从哪种平台的细节规范,被部署在哪台机器上则是后面的元素所描述的。binding、service和port元素用于描述WSDL的具体部署实现
service描述的是一个具体的被部署的Web服务所提供的所有访问入口的部署细节,一个service往往会包含多个服务访问入口,而每个访问入口都会使用一个port元素来描述。
port描述的是一个服务访问入口的部署细节,包括通过哪个Web地址(URL)来访问,应当使用怎样的消息调用模式来访问等。其中消息调用模式则是使用binding结构来表示。
binding结构定义了某个portType与某一种具体的网络传输协议或消息传输协议相绑定,从这一层次开始,描述的内容就与具体服务的部署相关了。比如可以将portType与SOAP/HTTP绑定,也可以将portType与MIME/SMTP相绑定等。
WSDL声明
definitions元素
所有WSDL文档的根元素都是definition元素。<definitions>
定义了文档中用到的各个xml元素的namespace缩写,也界定了本文档自己的 targetNamespace,这意味着其它的XML要引用当前XML中的元素时,要声明这个namespace。
在definition中可以使用xmlns=”namespaceURI”定义默认命名空间,一般是xmlns=”http://schemas.xmlsoap.org/wsdl/" ,这样就不用显式地在每个WSDL元素前加命名空间前缀了,即<wsdl:types>
可省略为<types>
,<wsdl:messages>
可省略为<messages>
,<wsdl:portType>
可省略为<portType>
等等,文档中所有元素缺省应属于默认命名空间。
import元素
<import>
元素可以让当前的文档使用其他WSDL文档中指定命名空间中的定义。
WSDL的import元素必须声明两个属性,即namespace属性和location属性。
namespace属性必须和正导入的WSDL文档中声明的targetNamespace相匹配。
location属性必须指向一个实际的WSDL文档。
types元素
<types>
元素是一个数据类型定义的容器,包含了所有在消息定义中需要的XML元素的类型定义。它是独立于机器和语言的类型定义,这些数据类型被message标签所使用。
WSDL抽象接口
message元素
<message>
元素定义webservice函数的参数和返回值,在webservice中输入参数和输出参数需要分开定义,使用不同的message标签体,一个message中可以有多个输入参数,每一个输入或者输出参数使用part元素定义,part中,基本类型用type声明,自定义类型用element引用types中定义的类型。
message定义的输入输出参数,被portType标签使用。
portType元素
<portType>
元素定义了Web服务的抽象接口,它可以由一个或者多个operation元素,每个operation元素定义了一个RPC样式或者文档样式的Web服务方法。<operation>
元素要用一个或者多个messages消息来定义它的输入、输出以及错误。
operation元素中,<input>
表示传递到Web服务的有效负载;<output>
表示返回给客户的有效负载;可以不包括,也可以包括一个或者多个<fault>
错误消息。
WSDL消息交换模式(MEP)
Messaging Exchange Patterns(MEP)
Web服务中使用了四种消息交换模式,即请求/响应、单向、通知以及恳求/响应模式。大多数基于WSDL的web服务使用请求/响应和单向两种模式。
WSDL通过operation元素的input/output来定义使用那种模式,如果有input+output+可选的fault参数,那就使用请求/响应模式;如果只使用input,那就使用单向模式。
在通知模式中:Web服务将消息发送给客户,但不等待回复;一般客户通过注册来接收通知;
在恳求/响应模式中类似通知模式,唯一的区别要期待客户对Web服务的响应。
portType实例:
<portType name="WSHello">
<operation name="helloService">
<input wsam:Action="http://wsServer.masi.com/WSHello/helloServiceRequest" message="tns:helloService"/>
<output wsam:Action="http://wsServer.masi.com/WSHello/helloServiceResponse" message="tns:helloServiceResponse"/>
</operation>
</portType>
WSDL实现
binding元素
<binding>
元素将一个抽象的portType映射到一组具体的协议(SOAP或者HTTP)、消息传递样式(RPC或者document)以及编码样式(literal或者SOAP encoding)。每个portType都有一个对应的binding元素。
binding元素中用到命名空间”http://schemas.xmlsoap.org/wsdl/soap/" 中的一些元素,假定用命名空间soap来表示,xmlns:soap=”http://schemas.xmlsoap.org/wsdl/soap/"
- soap:binding元素指定了用于传输SOAP消息的Internet协议以及operation缺省的消息类型(RPC还是document类型),例如:
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
- soap:operation元素指定了消息传递样式(RPC或者document),并且指定了SOAPAction字段的值。例如:
<soap:operation soapAction="" style="document"/>
- soap:body元素,soap:body元素有四个属性use、namespace、part和encodingStyle。对于WS-I use的属性值必须是literal,意味着不是用编码的方式,所以永远不会用到encodingStyle属性。在RPC样式中,必须用一个有效的URI指定的namespace属性。此URI可以于WSDL文档的targetNampspce相同;而在document样式中不能使用namespace,XML文档样式的命名空间派生于它的XML文档。
binding实例:
<binding name="WSHelloPortBinding" type="tns:WSHello">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="helloService">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
service元素
<service>
元素定义每个binding的端口地址。
service元素包含一个或者多个port元素,每一个port元素对应一个不同的Web服务,port将一个URL赋予一个特定的binding,通过address实现。
soap:address元素将Internet地址通过location属性赋予一个SOAP绑定。
可以使两个或者多个port元素将不同的URL赋给相同的binding,例如负载平衡和容错的时候,使用这种方法。
service实例:
<service name="WSHelloService">
<port name="WSHelloPort" binding="tns:WSHelloPortBinding">
<soap:address location="http://172.27.6.215:8234/helloService"/>
</port>
</service>
参考
WebService 之 WSDL文件 讲解
http://blog.csdn.net/tropica/article/details/3203892
WebService CXF学习(入门篇3):WSDL描述
http://xuzhfa123.iteye.com/blog/566460
webservice之WSDL文件详解
http://zengjz88.iteye.com/blog/1668725
上一篇 SOAP
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: