由于通信协议和消息格式在 Web 技术圈子里已经达到了标准化,我们知道在通常的开发过程中,对于对象的Interface一定具备相应的SDK描述文档,Web服务也是一种对象,只不过 它是被部署在Web上而已。很自然的,我们也完全需要有对Web服务这个对象的界面的SDK描述文档。然而这两者又不尽相同,一来目前在Web上的应用已 经完全接受了XML这个基本的标准,基本上所有新出台的技术都是基于XML标准的,二来Web服务的目标是即时装配,松散耦合以及自动集成的,这意味着 SDK描述文档应当是具备被机器识别的能力的。
也就是说,对于使用标准化的消息格式/通信协议的Web服务,它需要以某种结构化的方式(即XML)对Web服务的调用 /通信加以描述,而且实现这一点也显得非常重要,这是Web服务即时装配的基本保证。WSDL正是这样一种描述语言,WSDL 定义了一套基于 XML的语法,将Web服务描述为能够进行消息交换的服务访问点的集合,从而满足了这种需求。WSDL 服务定义为分布式系统提供了可机器识别的SDK文档,并且可用于描述自动执行应用程序通信中所涉及的细节。
WSDL 文档将Web服务定义为服务访问点或端口的集合。在 WSDL 中,由于服务访问点和消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来,因此可以对抽象定义进行再次使用:消息,指对交换数据的抽象描述;而端 口类型,指操作的抽象集合。用于特定端口类型的具体协议和数据格式规范构成了可以再次使用的绑定。将Web访问地址与可再次使用的绑定相关联,可以定义一 个端口,而端口的集合则定义为服务。因此,WSDL 文档在Web服务的定义中使用下列元素:
- Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。
- Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
- Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
- PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。
- Binding - 特定端口类型的具体协议和数据格式规范的绑定。
- Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
- Service - 相关服务访问点的集合。
大家可以参考下图,来理解一下WSDL文档的结构组织:
其中,Types是一个数据类型定义的容器,包含了所有在消息定义中需要的XML元素的类型定义,我将在今后的文章中结合XML Schema来详细说明如何进行类型定义。
Message具体定义了在通信中使用的消息的数据结构,Message元素包含了一组Part元素,每个Part元素都 是最终消息的一个组成部分,每个Part都会引用一个DataType来表示它的结构。Part元素不支持嵌套(可以使用DataType来完成这方面的 需要),都是并列出现。
PortType具体定义了一种服务访问入口的类型,何谓访问入口的类型呢?就是传入/传出消息的模式及其格式。一个 PortType可以包含若干个Operation,而一个Operation则是指访问入口支持的一种类型的调用。在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"。不过,没有为这个操作定义任何输出。伪代码相当于:
function setTerm(string term, string value){ ... return null; }
一个 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>
在这个例子中,<portType> 元素把 "glossaryTerms" 定义为某个端口的名称,把 "getTerm" 定义为某个操作的名称。
操作 "getTerm" 拥有一个名为 "getTermRequest" 的输入消息,以及一个名为 "getTermResponse" 的输出消息。
<message> 元素可定义每个消息的部件,以及相关联的数据类型。
对比传统的编程,glossaryTerms 是一个函数库,而 "getTerm" 是带有输入参数 "getTermRequest" 和返回参数 getTermResponse 的一个函数。
namespace的作用是要避免命名冲突。如果我建立一项Web Service,其中的WSDL文件包含一个名为"foo"的元素,而你想要使用我的服务与另一项服务连接作为补充,这样的话另一项服务的WSDL文件就 不能包含名为"foo"的元素。两个服务器程序只有在它们在两个事例中表示完全相同的东西时,才可以取相同的名字。如果有了表示区别的 namespace,我的网络服务里的"foo"就可以表示完全不同于另一个网络服务里"foo"的含义。在你的客户端里,你只要加以限制就可以引用我 的"foo"。
见下例:http://www.infotects.com/fooService#foo 就是完全限制的名字,相当于"carlos:foo",如果我声明了carlos作为http://www.infotects.com /fooService的快捷方式。请注意namespace中的URL是用来确定它们的唯一性的,同时也便于定位。URL所指向的地方不必是实际存在的 网络地址,也可以使用GUID来代替或补充URL。例如,GUID"335DB901-D44A-11D4-A96E-0080AD76435D"就是一 个合法的namespace指派。
targetNamespace 属性声明了一个namespace,元素中所有的声明的名字都列于其内。在WSDL示例中,<definitions>的targetNamespace 是http://tempuri.org/wsdl 。这意味着所有在WSDL文档中声明的名字都属于这个namespace。<schema>元素有自己的targetNamespace属性,其值为 http://tempuri.org/xsd ,在<schma>元素中定义的所有名字都属于这个namespace而不是main的target namespace。
<?xml version = "1.0" encoding = "UTF-8"?> <configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config"> <service name="HelloService" targetNamespace="urn:Star" typeNamespace="urn:Star" packageName="helloservice"> <interface name="helloservice.HelloIF"/> </service> </configuration>
name =”HelloService” 服务名称:HelloService
targetNamespace=”urn:Star” WSDL名字空间:urn:Star
<interface name=”helloservice.HelloIF”/> 服务的端点(endpoint)接口:helloservice.HelloIF
分清 URI、URL 和 URN
URI、URL和URN是识别、定位和命名互联网上的资源的标准途径; URL,URN是URI的子集.
URI不能定位或读取/写入资源。这是统一的资源定位器(URL)的任务。URL是一种URI,但是它的大纲组件是已知的网络协议(简称协议),并且它把URI组件与某种协议处理程序(一种资源定位器和根据协议建立的约束规则与资源通讯的读/写机制)。
URI一般不能为资源提供持久不便的名称。这是统一的资源命名(URN)的任务。URN也是一种URI,但是全球唯一的、持久不便的,即使资源不在存在或不再使用。
web上地址的基本形式是URI,它代表统一资源标识符。有两种形式:
URL:目前URI的最普遍形式就是无处不在的URL或统一资源定位器。
URN:URL的一种更新形式,统一资源名称(URN, Uniform Resource Name)不依赖于位置 ,并且有可能减少失效连接的个数。但是其流行还需假以时日,因为它需要更精密软件的支持。
体系中的URI、URL和URN是彼此关联的。URI的范畴位于体系的顶层,URL和URN的范畴位于体系的底层。这种排列显示URL和URN都是URI的子范畴, URI表示的是统一的资源标识,它是以某种统一的(标准化的)方式标识资源的简单字符串。
按照 URI 标准,上面的第一个例子 —— http://www.cisco.com/en/US/partners/index.html —— 实际上是一个 URI,并且它由以下几个组成部分:
- 方案名 (
http
) - 域名 (
www.cisco.com
) - 路径 (
/en/US/partners/index.html
)
其中的一些例子有:
mailto:mbox@domain
ftp://host/file
http://domain/path
<definitions name="TravelApprove"
targetNamespace="http://eclipse.org/bpel/travel"
xmlns:tns="http://eclipse.org/bpel/travel"
xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
>
这句话也定义一个"TravelApprove" 属于http://eclipse.org/bpel/travel命名空间!
<portType name="StockQuotePortType"> <operation name="GetLastTradePrice"> <input message="tns:GetLastTradePriceInput"/> <output message="tns:GetLastTradePriceOutput"/> </operation> </portType>
这部分定义了服务访问点的调用模式的类型,表明StockQuoteService的某个入口类型是请求/响应模式,请求消息是GetlastTradePriceInput,而响应消息是GetLastTradePriceOutput。
<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="GetLastTradePrice"> <soap:operation soapAction="http://example.com/GetLastTradePrice"/> <input> <soap:body use="literal" namespace="http://example.com/stockquote.xsd" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <soap:body use="literal" namespace="http://example.com/stockquote.xsd" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> </soap:operation> </operation> </soap:binding> </binding>
这部分将服务访问点的抽象定义与SOAP HTTP绑定,描述如何通过SOAP/HTTP来访问按照前面描述的访问入口点类型部署的访问入口。其中规定了在具体SOAP调用时,应当使用的 soapAction是"http://example.com/GetLastTradePrice",而请求/响应消息的编码风格都应当采用SOAP 规范默认定义的编码风格"http://schemas.xmlsoap.org/soap/encoding/"。
<service name="StockQuoteService"> <documentation>股票查询服务</documentation> <port name="StockQuotePort" binding="tns:StockQuoteBinding"> <soap:address location="http://example.com/stockquote"/> </port> </service> </definitions>
这部分是具体的Web服务的定义,在这个名为StockQuoteService的Web服务中,提供了一个服务访问入口,访问地址是"http://example.com/stockquote",使用的消息模式是由前面的binding所定义的。
按照这个WSDL文档的描述,在具体Web服务的使用中,具体发生的SOAP交互可能如下面所示:
相关推荐
WSDL解析工具是开发人员用来理解和操作WSDL文件的重要辅助工具。本文将深入探讨WSDL解析工具及其在IT行业中的应用。 一、WSDL的概述 1.1 WSDL的基本概念 WSDL是Web服务的核心标准之一,它定义了服务提供者和消费者...
本项目“WSDL.rar”提供了一个C#编写的WSDL解析器,旨在帮助开发者更好地理解和操作WSDL文件。 首先,WSDL是一种XML文档,它详细描述了Web服务的接口,包括服务提供的操作、输入和输出消息的结构以及服务的位置。在...
【标题】:“官网下载的所有wsdl文件” 在IT领域,Web Service Definition Language(WS-DL)是一种XML格式的规范,用于定义Web服务的接口。它详细描述了服务提供者和消费者之间的交互方式,包括可用的操作、消息...
总结,Java解析WSDL文档获取具体的方法与参数涉及的主要知识点包括:XML解析(DOM)、JAX-WS框架、`javax.xml.ws.Service`类的使用,以及如何基于WSDL生成服务客户端代码。理解这些概念,将有助于开发和消费Web服务...
### 使用WSDL4J解析WSDL文件 1. **导入依赖**:在项目中引入WSDL4J的库,通常是通过Maven或Gradle的依赖管理来完成。 2. **加载WSDL**:使用`WSDLReader`类读取WSDL文件,例如`WSDLReader reader = WSDLFactory.new...
WSDL文件解析是理解Web服务功能和如何与其交互的关键步骤。 WSDL文档主要由两大部分构成:抽象定义和具体定义。 1. 抽象定义: - **Types**:这部分定义了与机器和编程语言无关的数据类型,如字符串、整数等。...
在本篇文章中,我们将深入探讨WSDL的基本结构、组成部分、以及如何解析一个WSDL文件。 1. **WSDL的基本结构** WSDL文件由一系列元素组成,包括服务、消息、操作、绑定、接口等。每个元素都有其特定的作用: - **...
一个wsdl文件,用axis2解析,一个wsdl文件,用axis2解析,
标题提及的“onvif所有 wsdl文件”是指用于ONVIF协议开发的各种WSDL文件集合。这些文件是XML文档,详细定义了ONVIF服务的接口、消息格式以及如何通过SOAP(Simple Object Access Protocol)进行通信。开发者可以利用...
VS2010提供了一键式生成客户端代理类的功能,可以直接通过添加服务引用的方式,自动处理wsdl文件解析和代理类的生成,简化了开发流程。 标签“据wsdl文”强调了WSDL文件在整个过程中的关键作用。它不仅定义了服务的...
【标题】:“把wsdl文件或地址...MyEclipse和Apache CXF的wsdl2java工具都是常用的解决方案,它们通过解析WSDL文件,自动生成与服务接口对应的Java类,使得开发者可以专注于业务逻辑的实现,而不用关心底层通信的细节。
### WSDL 文件解析与知识点详解 #### 一、WSDL 文件概述 WSDL(Web Services Description Language)是一种基于 XML 的语言,用于描述网络服务的工作方式。它定义了服务的抽象接口、具体绑定以及如何访问这些服务...
一个用wsdl4j.jar,ws-commons-java5-1.0.1.jar,XmlSchema-1.3.2.jar完全解析wsdl的例子, 本例子原本是xcalia studio中的一个模块,拿来和初次接触的人参考,因为我走了很多弯路,希望别人能少走。
一个WSDL文件通常包含服务定义、消息定义、端点(port)定义以及绑定定义。服务定义指明了服务的名称,消息定义描述了交换的数据,端点定义了服务的访问地址,而绑定定义了通信协议和数据格式。 在Java中,我们可以...
芥末一个简单的WSDL解析器。安装Wasabi可通过,并可通过以下方式安装: $ gem install wasabi入门document = Wasabi . document File . read ( "some.wsdl" ) 获取SOAP端点: document . endpoint# => ...
在本话题中,我们将深入探讨如何利用WSDL文件生成Java代码,以便于开发和调用WebService。 WSDL文件是WebService的核心,它定义了服务的接口、消息格式、操作和地址等信息。WSDL是XML格式的,可以被工具解析并生成...
- **服务消费者**:通过解析WSDL文件,客户端应用程序可以了解服务的接口,从而构建请求并解析响应。 - **服务提供者**:创建WSDL文件来描述服务,便于其他开发者集成和使用。 - **自动化工具**:许多开发工具支持...
在“onvif_wsdl”这个压缩包中,可能包含的是与ONVIF相关的WSDL文件,以及可能的辅助文件如.nsmap(命名空间映射文件)和.h(C++头文件),.nsmap文件用于帮助解析和处理WSDL中引用的命名空间,而.h文件可能包含了对...