在继续学习以前,您须要对下面的知识有基本的了解:web
XML编程
XML 命名空间网络
XML Schema框架
若是您但愿首先学习这些项目,请访问咱们的 XML 系列教程。编程语言
WSDL 指网络服务描述语言ide
WSDL 使用 XML 编写函数
WSDL 是一种 XML 文档学习
WSDL 用于描述网络服务网站
WSDL 也可用于定位网络服务编码
WSDL 还不是 W3C 标准
WSDL 指网络服务描述语言 (Web Services Description Language)。
WSDL 是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操做(或方法)。
WSDL 文档结构
WSDL 文档是利用这些主要的元素来描述某个 web service 的:
元素 | 定义 |
<portType> | web service 执行的操做 |
<message> | web service 使用的消息 |
<types> | web service 使用的数据类型 |
<binding> | web service 使用的通讯协议 |
一个 WSDL 文档的主要结构是相似这样的:
<definitions> <types> definition of types........</types> <message> definition of a message....</message> <portType> definition of a port.......</portType> <binding> definition of a binding....</binding> </definitions>
WSDL 文档可包含其它的元素,好比 extension 元素,以及一个 service 元素,此元素可把若干个 web services 的定义组合在一个单一的 WSDL 文档中。
<portType> 元素是最重要的 WSDL 元素。
它可描述一个 web service、可被执行的操做,以及相关的消息。
能够把 <portType> 元素比做传统编程语言中的一个函数库(或一个模块、或一个类)。
<message> 元素定义一个操做的数据元素。
每一个消息均由一个或多个部件组成。能够把这些部件比做传统编程语言中一个函数调用的参数。
<types> 元素定义 web service 使用的数据类型。
为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。
<binding> 元素为每一个端口定义消息格式和协议细节。
这是某个 WSDL 文档的简化的片断:
<message name="getTermRequest"> <part name="term" type="xs:string"/> </message> <message name="getTermResponse"> <part name="value" type="xs:string"/> </message> <portType name="glossaryTerms"> <operation name="getTerm"> <input message="getTermRequest"/> <output message="getTermResponse"/> </operation> </portType>
在这个例子中,<portType> 元素把 "glossaryTerms" 定义为某个端口的名称,把 "getTerm" 定义为某个操做的名称。
操做 "getTerm" 拥有一个名为 "getTermRequest" 的输入消息,以及一个名为 "getTermResponse" 的输出消息。
<message> 元素可定义每一个消息的部件,以及相关联的数据类型。
对比传统的编程,glossaryTerms 是一个函数库,而 "getTerm" 是带有输入参数 "getTermRequest" 和返回参数 getTermResponse 的一个函数。
WSDL 端口可描述由某个 web service 提供的界面(合法操做)。
<portType> 元素是最重要的 WSDL 元素。
它可描述一个 web service、可被执行的操做,以及相关的消息。
端口定义了指向某个 web service 的链接点。能够把该元素比做传统编程语言中的一个函数库(或一个模块、或一个类),而把每一个操做比做传统编程语言中的一个函数。
操做类型
请求-响应是最普通的操做类型,不过 WSDL 定义了四种类型:
类型 | 定义 |
One-way | 此操做可接受消息,但不会返回响应。 |
Request-response | 此操做可接受一个请求并会返回一个响应 |
Solicit-response | 此操做可发送一个请求,并会等待一个响应。 |
Notification | 此操做可发送一条消息,但不会等待响应。 |
一个 one-way 操做的例子:
<message name="newTermValues"> <part name="term" type="xs:string"/> <part name="value" type="xs:string"/> </message> <portType name="glossaryTerms"> <operation name="setTerm"> <input name="newTerm" message="newTermValues"/> </operation> </portType >
在这个例子中,端口 "glossaryTerms" 定义了一个名为 "setTerm" 的 one-way 操做。
这个 "setTerm" 操做可接受新术语表项目消息的输入,这些消息使用一条名为 "newTermValues" 的消息,此消息带有输入参数 "term" 和 "value"。不过,没有为这个操做定义任何输出。
一个 request-response 操做的例子:
<message name="getTermRequest"> <part name="term" type="xs:string"/> </message> <message name="getTermResponse"> <part name="value" type="xs:string"/> </message> <portType name="glossaryTerms"> <operation name="getTerm"> <input message="getTermRequest"/> <output message="getTermResponse"/> </operation> </portType>
在这个例子中,端口 "glossaryTerms" 定义了一个名为 "getTerm" 的 request-response 操做。
"getTerm" 操做会请求一个名为 "getTermRequest" 的输入消息,此消息带有一个名为 "term" 的参数,并将返回一个名为 "getTermResponse" 的输出消息,此消息带有一个名为 "value" 的参数。
WSDL 绑定可为 web service 定义消息格式和协议细节。
一个 请求 - 响应 操做的例子:
<message name="getTermRequest"> <part name="term" type="xs:string" /> </message> <message name="getTermResponse"> <part name="value" type="xs:string" /> </message> <portType name="glossaryTerms"> <operation name="getTerm"> <input message="getTermRequest" /> <output message="getTermResponse" /> </operation> </portType> <binding type="glossaryTerms" name="b1"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <operation> <soap:operation soapAction="http://example.com/getTerm" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> </binding>
binding 元素有两个属性 - name 属性和 type 属性。
name 属性定义 binding 的名称,而 type 属性指向用于 binding 的端口,在这个例子中是 "glossaryTerms" 端口。
soap:binding 元素有两个属性 - style 属性和 transport 属性。
style 属性可取值 "rpc" 或 "document"。在这个例子中咱们使用 document。transport 属性定义了要使用的 SOAP 协议。在这个例子中咱们使用 HTTP。
operation 元素定义了每一个端口提供的操做符。
对于每一个操做,相应的 SOAP 行为都须要被定义。同时您必须如何对输入和输出进行编码。在这个例子中咱们使用了 "literal"。
UDDI 是一种目录服务,企业可使用它对 Web services 进行注册和搜索。
UDDI,英文为 "Universal Description, Discovery and Integration",可译为“通用描述、发现与集成服务”。
UDDI 是一个独立于平台的框架,用于经过使用 Internet 来描述服务,发现企业,并对企业服务进行集成。
UDDI 指的是通用描述、发现与集成服务
UDDI 是一种用于存储有关 web services 的信息的目录。
UDDI 是一种由 WSDL 描述的 web services 界面的目录。
UDDI 经由 SOAP 进行通讯
UDDI 被构建入了微软的 .NET 平台
UDDI 使用 W3C 和 IETF* 的因特网标准,好比 XML、HTTP 和 DNS 协议。
UDDI 使用 WSDL 来描述到达 web services 的界面
此外,经过采用 SOAP,还能够实现跨平台的编程特性,你们知道,SOAP 是 XML 的协议通讯规范,可在 W3C 的网站找到相关的信息。
*注释:IETF - Internet Engineering Task Force
任何规模的行业或企业都能得益于 UDDI。
在 UDDI 以前,还不存在一种 Internet 标准,能够供企业为它们的企业和伙伴提供有关其产品和服务的信息。也不存在一种方法,来集成到彼此的系统和进程中。
UDDI 规范帮助咱们解决的问题:
使得在成百万当前在线的企业中发现正确的企业成为可能
定义一旦首选的企业被发现后如何启动商业
扩展新客户并增长对目前客户的访问
扩展销售并延伸市场范围
知足用户驱动的须要,为在全球 Internet 经济中快速合做的促进来清除障碍
假如行业发布了一个用于航班比率检测和预订的 UDDI 标准,航空公司就能够把它们的服务注册到一个 UDDI 目录中。而后旅行社就可以搜索这个 UDDI 目录以找到航空公司预订界面。当此界面被找到后,旅行社就可以当即与此服务进行通讯,这样因为它使用了一套定义良好的预订界面。
UDDI 是一个跨行业的研究项目,由全部主要的平台和软件提供商驱动,好比:Dell, Fujitsu, HP, Hitachi, IBM, Intel, Microsoft, Oracle, SAP, 以及 Sun, 它既是一个市场经营者的团体,也是一个电子商务的领导者。
已有数百家公司参与了这个 UDDI 团体。
WSDL语法
<wsdl:definitions name="nmtoken"? targetNamespace="uri"> <import namespace="uri" location="uri"/> * <wsdl:documentation .... /> ? <wsdl:types> ? <wsdl:documentation .... /> ? <xsd:schema .... /> * </wsdl:types> <wsdl:message name="ncname"> * <wsdl:documentation .... /> ? <part name="ncname" element="qname"? type="qname"?/> * </wsdl:message> <wsdl:portType name="ncname"> * <wsdl:documentation .... /> ? <wsdl:operation name="ncname"> * <wsdl:documentation .... /> ? <wsdl:input message="qname"> ? <wsdl:documentation .... /> ? </wsdl:input> <wsdl:output message="qname"> ? <wsdl:documentation .... /> ? </wsdl:output> <wsdl:fault name="ncname" message="qname"> * <wsdl:documentation .... /> ? </wsdl:fault> </wsdl:operation> </wsdl:portType> <wsdl:serviceType name="ncname"> * <wsdl:portType name="qname"/> + </wsdl:serviceType> <wsdl:binding name="ncname" type="qname"> * <wsdl:documentation .... /> ? <-- binding details --> * <wsdl:operation name="ncname"> * <wsdl:documentation .... /> ? <-- binding details --> * <wsdl:input> ? <wsdl:documentation .... /> ? <-- binding details --> </wsdl:input> <wsdl:output> ? <wsdl:documentation .... /> ? <-- binding details --> * </wsdl:output> <wsdl:fault name="ncname"> * <wsdl:documentation .... /> ? <-- binding details --> * </wsdl:fault> </wsdl:operation> </wsdl:binding> <wsdl:service name="ncname" serviceType="qname"> * <wsdl:documentation .... /> ? <wsdl:port name="ncname" binding="qname"> * <wsdl:documentation .... /> ? <-- address details --> </wsdl:port> </wsdl:service> </wsdl:definitions>
总结
本教程已为您讲解了如何建立可描述 web 服务的 WSDL 文档。它也规定了服务的位置和服务所提供的操做(或方法)。
您已经学习到如何为 web 服务定义消息格式和协议细节。
您也学习了可经过 UDDI 来注册和搜索 web 服务。