WSDL的主要文档元素
WSDL文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随 机器或语言而变的元素。这就定义了一系列服务,截然不同的应用都可以实现。具体部分,如数据的序列化则归入底部分,因为它包含具体的定义。在上述的文档元 素中,<types>、<message>、<portType>属于抽象定义 层,<binding>、<service>属于具体定义层。所有的抽象可以是单独存在于别的文件中,也可以从主文档中导入。
WSDL文档的结构实例解析
下面我们将通过一个实际的WSDL文档例子来详细说明各标签的作用及关系。
- <?xml version="1.0" encoding="UTF-8"?>
- <definitions
- xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
- xmlns:tns="http://www.jsoso.com/wstest"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns="http://schemas.xmlsoap.org/wsdl/"
- targetNamespace="http://www.jsoso.com/wstest"
- name="Example">
- <types>
- <xsd:schema>
- <xsd:import
- namespace="http://www.jsoso.com/wstest"
- schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>
- </xsd:schema>
- </types>
- <message name="toSayHello">
- <part name="userName" type="xsd:string"></part>
- </message>
- <message name="toSayHelloResponse">
- <part name="returnWord" type="xsd:string"></part>
- </message>
- <message name="sayHello">
- <part name="person" type="tns:person"></part>
- <part name="arg1" type="xsd:string"></part>
- </message>
- <message name="sayHelloResponse">
- <part name="personList" type="tns:personArray"></part>
- </message>
- <message name="HelloException">
- <part name="fault" element="tns:HelloException"></part>
- </message>
- <portType name="Example">
- <operation name="toSayHello" parameterOrder="userName">
- <input message="tns:toSayHello"></input>
- <output message="tns:toSayHelloResponse"></output>
- </operation>
- <operation name="sayHello" parameterOrder="person arg1">
- <input message="tns:sayHello"></input>
- <output message="tns:sayHelloResponse"></output>
- <fault message="tns:HelloException" name="HelloException"></fault>
- </operation>
- </portType>
- <binding name="ExamplePortBinding" type="tns:Example">
- <soap:binding
- transport="http://schemas.xmlsoap.org/soap/http"
- style="rpc"></soap:binding>
- <operation name="toSayHello">
- <soap:operation soapAction="sayHello"></soap:operation>
- <input>
- <soap:body use="literal"
- namespace="http://www.jsoso.com/wstest"></soap:body>
- </input>
- <output>
- <soap:body use="literal"
- namespace="http://www.jsoso.com/wstest"></soap:body>
- </output>
- </operation>
- <operation name="sayHello">
- <soap:operation soapAction="sayHello"></soap:operation>
- <input>
- <soap:body use="literal"
- namespace="http://www.jsoso.com/wstest"></soap:body>
- </input>
- <output>
- <soap:body use="literal"
- namespace="http://www.jsoso.com/wstest"></soap:body>
- </output>
- <fault name="HelloException">
- <soap:fault name="HelloException" use="literal"></soap:fault>
- </fault>
- </operation>
- </binding>
- <service name="Example">
- <port name="ExamplePort" binding="tns:ExamplePortBinding">
- <soap:address location="http://localhost:8080/hello"></soap:address>
- </port>
- </service>
- </definitions>
由于上面的事例XML较长,我们将其逐段分解讲解
WSDL文档的根元素:<definitions>
- <definitions
- xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
- xmlns:tns="http://www.jsoso.com/wstest"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns="http://schemas.xmlsoap.org/wsdl/"
- targetNamespace="http://www.jsoso.com/wstest"
- name="Example">
- ……
- ……
- </definitions>
<definitions>定义了文档中用到的各个xml元素的namespace缩写,也界定了本文档自己的 targetNamespace="http://www.jsoso.com/wstest",这意味着其它的XML要引用当前XML中的元素时,要声 明这个namespace。注意xmlns:tns="http://www.jsoso.com/wstest"这个声明,它标示了使用tns这个前缀 指向自身的命名空间。
WSDL文档数据类型定义元素:<types>
- <types>
- <xsd:schema>
- <xsd:import
- namespace="http://www.jsoso.com/wstest"
- schemaLocation="http://localhost:8080/hello?xsd=1"></xsd:import>
- </xsd:schema>
- </types>
<types>标签定义了当前的WSDL文档用到的数据类型。要说明的是,为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。这些数据类型用来定义web service方法的参数和返回指。对于通用的原生数据类型如:integer , boolean , char , float等,在W3C的标准文档http://www.w3.org/2001/XMLSchema中已经做了定义。这里我们要引入的schema定义 schemaLocation="http://localhost:8080/hello?xsd=1"是我们自定义的Java对象类型。
WSDL文档消息体定义元素:< message >
- <message name="toSayHello">
- <part name="userName" type="xsd:string"></part>
- </message>
- <message name="toSayHelloResponse">
- <part name="returnWord" type="xsd:string"></part>
- </message>
- <message name="sayHello">
- <part name="person" type="tns:person"></part>
- <part name="arg1" type="xsd:string"></part>
- </message>
- <message name="sayHelloResponse">
- <part name="personList" type="tns:personArray"></part>
- </message>
- <message name="HelloException">
- <part name="fault" element="tns:HelloException"></part>
- </message>
<message>元素定义了web service函数的参数。<message>元素中的每个<part>子元素都和某个参数相符。输入参数在<message>元素中定义,与输出参数相 隔离,输出参数有自己的<message>元素。兼作输入、输出的参数在输入输出的<message>元素中有它们相应的<part>元素。输出 <message>元素以"Response"结尾,对Java而言方法得返回值就对应一个输出的<message>。每个<part>元素都有名字和类 型属性,就像函数的参数有参数名和参数类型。
在上面的文档中有两个输入参数、两个输出参数和一个错误参数(对应Java中的Exception)。
输入参数<message>的name属性分别命名为toSayHello,sayHello。
toSayHello对应输入参数userName,参数类型为xsd:string,在Java语言中就是String;
sayHello对应两个输入参数person和arg1,类型为tns:person和xsd:string。这里tns:person类型就是引用了< types >标签中的类型定义。
输出参数<message>的name属性分别命名为toSayHelloResponse和sayHelloResponse。
这个名称和输入参数的<message>标签name属性对应,在其后面加上Response尾缀。
toSayHelloResponse对应的返回值是returnWord,参数类型为xsd:string;
sayHelloResponse对应的返回值是personList,参数类型为tns:personArray(自定义类型);
错误参数<message>的name属性为HelloException。
它的<part>子标签element而不是type来定义类型。
以上的message标签的name属性通常使用web service函数方法名作为参照,错误参数标签则使用异常类名为参照。标签中的参数名称,即part子元素的name属性是可自定义的(下一章节详细说 明)。message标签的参数类型将引用types标签的定义。
WSDL文档函数体定义元素:< portType >
- <portType name="Example">
- <operation name="toSayHello" parameterOrder="userName">
- <input message="tns:toSayHello"></input>
- <output message="tns:toSayHelloResponse"></output>
- </operation>
- <operation name="sayHello" parameterOrder="person arg1">
- <input message="tns:sayHello"></input>
- <output message="tns:sayHelloResponse"></output>
- <fault message="tns:HelloException" name="HelloException"></fault>
- </operation>
- </portType>
在<operation>元素中,name属性表示服务方法名,parameterOrder属性表示方法的参数顺序,使用空格符分割多个参 数,如:“parameterOrder="person arg1”。<operation>元素的子标签<input>表示输入参数说明,它引用<message>标签中的输入参 数。<output>表示输出参数说明,它引用<message>标签中的输出参数。<fault>标签在Java方法中的特别 用来表示异常(其它语言有对应的错误处理机制),它引用<message>标签中的错误参数。
WSDL绑定实现定义元素:< binding >
- <binding name="ExamplePortBinding" type="tns:Example">
- <soap:binding
- transport="http://schemas.xmlsoap.org/soap/http"
- style="rpc"></soap:binding>
- <operation name="toSayHello">
- <soap:operation soapAction="sayHello"></soap:operation>
- <input>
- <soap:body use="literal"
- namespace="http://www.jsoso.com/wstest"></soap:body>
- </input>
- <output>
- <soap:body use="literal"
- namespace="http://www.jsoso.com/wstest"></soap:body>
- </output>
- </operation>
- <operation name="sayHello">
- <soap:operation soapAction="sayHello"></soap:operation>
- <input>
- <soap:body use="literal"
- namespace="http://www.jsoso.com/wstest"></soap:body>
- </input>
- <output>
- <soap:body use="literal"
- namespace="http://www.jsoso.com/wstest"></soap:body>
- </output>
- <fault name="HelloException">
- <soap:fault name="HelloException" use="literal"></soap:fault>
- </fault>
- </operation>
- </binding>
<binding>标签是完整描述协议、序列化和编码的地方,<types>,<message>和<portType>标签处理抽象的数据内容,而<binding>标签是处理数据传输的物理实现。
<binding>标签把前三部分的抽象定义具体化。
首先<binding>标签使用<soap:binding>的transport和style属性定义了Web Service的通讯协议HTTP和SOAP的请求风格RPC。其次<operation>子标签将portType中定义的 operation同SOAP的请求绑定,定义了操作名称soapAction,输出输入参数和异常的编码方式及命名空间。
WSDL服务地址绑定元素:< service >
- <service name="Example">
- <port name="ExamplePort" binding="tns:ExamplePortBinding">
- <soap:address location="http://localhost:8080/hello"></soap:address>
- </port>
- </service>
service是一套<port>元素。在一一对应形式下,每个<port>元素都和一个location关联。如果同一个<binding>有多个<port>元素与之关联,可以使用额外的URL地址作为替换。
一个WSDL文档中可以有多个<service>元素,而且多个<service>元素十分有用,其中之一就是可以根据目标URL来组织端口。在一个 WSDL文档中,<service>的name属性用来区分不同的service。在同一个service中,不同端口,使用端口的"name"属性区 分。
简单的描述了WSDL对SOAP协议的支持,以及在Web Service中的作用。
相关推荐
**简单WSDL实例详解** WSDL,全称为Web Services Description Language,是用于描述Web服务的一种XML格式。它定义了服务的接口,包括服务提供的操作、消息格式、通信协议以及服务的位置。WSDL文件是Web服务客户端和...
- **解析结构**:分析XML结构,找到服务、接口、操作、绑定等元素。 - **处理类型**:解析类型系统,获取数据类型定义。 - **解析消息**:理解消息结构,确定输入和输出参数。 - **解析操作**:识别每个操作的...
WSDL4J是一个Java库,专门用于解析和操作Web服务描述语言(WSDL)文件。WSDL是一种XML格式,用于定义网络服务的接口,包括其输入、输出、操作和服务绑定等信息。理解WSDL4J的工作原理和使用方法对于开发和消费基于...
总结,Java解析WSDL文档获取具体的方法与参数涉及的主要知识点包括:XML解析(DOM)、JAX-WS框架、`javax.xml.ws.Service`类的使用,以及如何基于WSDL生成服务客户端代码。理解这些概念,将有助于开发和消费Web服务...
在本例中,"C#调用WebService实例和开发(wsdl).pdf"可能包含详细的步骤和代码示例。 2. **添加引用**:将生成的代理类添加到你的项目中,这样就可以在C#代码中直接调用Web服务的方法。 3. **实例化代理类**:...
3. **自动代码生成**:许多工具(如Apache CXF、 Axis等)可以解析WSDL生成客户端代码,简化服务的调用。 **关于"wsdl4j":** 提到的"wsdl4j"是一个开源Java库,用于处理WSDL文件。它提供了API来读取、创建、修改...
这通常涉及模拟调用、使用WSDL解析器检查结构,或者直接部署到服务器进行实际测试。 10. **最佳实践**:在使用WSDL生成工具时,应遵循良好的设计原则,如保持接口清晰、避免过于复杂的类型定义,以及合理使用命名...
在本文中,我们将深入探讨如何解析WSDL URI,并通过源码分析来理解其工作原理。我们将以`ServerCreator.java`这个文件作为示例,它很可能是一个用于创建Web服务服务器端点的工具类。 首先,`ServerCreator.java`...
在视频中,可能还会讲解如何使用CXF工具解析和生成WSDL,例如使用wsdl2java命令行工具将WSDL转换为Java类,或者使用cxf-codegen-plugin Maven插件自动化这个过程。此外,可能会涉及到CXF的动态客户端,它可以从WSDL...
Java解析WSDL(Web Service Description Language)文档是一个关键任务,特别是在开发基于Web服务的应用程序时。WSDL是一种XML格式,用于定义服务接口、操作、消息结构以及如何通过网络调用这些服务。本示例将深入...
**WSDL实例解析** 在上述简化的WSDL片段中: - `<message>`元素定义了两个消息,一个用于请求(getTermRequest),一个用于响应(getTermResponse),每个消息都包含一个部分(part),定义了数据类型和名称。 - `...
通过分析和运行这个Demo,你可以深入理解Web服务的工作原理,包括WSDL如何描述服务,SOAP如何封装和传递消息,以及如何在实际项目中创建和消费Web服务。这个实例为你提供了宝贵的实践经验,有助于你在实际开发中更好...
通过阅读和分析压缩包中的WSDL实例,可以加深理解,并尝试使用工具创建自己的WSDL文档,实践服务的发布和调用。 总的来说,WSDL是Web服务的核心组件,理解并掌握WSDL对于进行Web服务开发至关重要。这个压缩包“wsdl...
**WSDL解析关键包** 在Java开发中,Web Service接口的描述通常采用WSDL(Web Service Description Language)文件。WSDL是一种XML格式的规范,用于定义网络服务的接口,包括服务的位置、操作、消息格式等关键信息。...
这个文件名可能是某个WSDL调用测试工具的实例或示例,它可能包含了一个具体的WSDL调用案例,用户可以通过这个例子学习如何使用测试工具来调用和测试Web服务。 总的来说,WSDL调用测试工具是开发和维护Web服务不可或...
6. **WSDL解析和生成** - 开发者可以手动编写WSDL,但更常见的是使用IDE(如Eclipse、IntelliJ IDEA)或工具(如Apache CXF、Microsoft .NET Framework)自动生成WSDL。 - 工具通常能根据服务接口或实现代码生成...
这个压缩包文件“WSDL资料”包含了关于WSDL的详细信息,旨在帮助用户理解和分析WSDL描述。** **一、WSDL简介** WSDL是一种XML格式的规范,它描述了Web服务如何通过网络进行通信。服务提供者使用WSDL来定义其服务的...
1. **WSDL结构**:WSDL文件由多个主要元素组成,如`<service>`定义服务接口,`<portType>`定义操作集合,`<binding>`定义传输协议和消息格式,`<port>`定义服务的实例,以及`<message>`定义交换的数据结构。...
【WebService WSDL结构分析】 Web Services Description Language(WSDL)是一种基于XML的应用,用于详细描述Web服务,使得客户端能够找到并与其交互。WSDL文档定义了一组服务访问点,允许客户端通过特定的传输协议...
1. **解析WSDL文档**:首先,我们需要读取并解析WSDL文档,通常使用XML解析库来完成这个任务。解析过程会创建一个文档对象模型(DOM),便于后续的查询和处理。 2. **提取`portType`元素**:遍历DOM,找到所有的`...