- 浏览: 1658841 次
- 性别:
文章分类
- 全部博客 (2929)
- 非技术 (18)
- Eclipse (11)
- JAVA (31)
- 正则表达式 (0)
- J2EE (4)
- DOS命令 (2)
- WEB前端 (52)
- JavaScript (69)
- 数据库 (8)
- 设计模式 (0)
- JFreechart (1)
- 操作系统 (1)
- 互联网 (10)
- EasyMock (1)
- jQuery (5)
- Struts2 (12)
- Spring (24)
- 浏览器 (16)
- OGNL (1)
- WebService (12)
- OSGi (14)
- 软件 (10)
- Tomcat (2)
- Ext (3)
- SiteMesh (2)
- 开源软件 (2)
- Hibernate (2)
- Quartz (6)
- iBatis (2)
最新评论
Web 服务是通过 WSDL 文档来描述的。WSDL 绑定描述了如何把服务绑定到消息传递协议(特别是 SOAP 消息传递协议)。WSDL SOAP 绑定可以是 RPC 样式的绑定,也可以是文档样式的绑定。同样,SOAP 绑定可以有编码的用法,也可以有文字的用法。这给我们提供了四种样式/用法模型:
- RPC/编码
- RPC/文字
- 文档/编码
- 文档/文字
除了这些样式之外,还有一种样式也很常见,它称为文档/文字包装的样式,算上这一种,在创建 WSDL 文件时您就有了五种绑定样式可以从中选择。您应该选择哪一种呢?
对于本文的讨论,让我们从 清单1 中的 Java 方法开始,并且对其应用 JAX-RPC Java-to-WSDL 规则(请参见 参考资料 )。
public void myMethod(int x); |
采用 清单1 中的方法并且使用您喜欢的 Java-to-WSDL 工具来运行它,指定您想让它生成 RPC/编码的 WSDL。您最后应该得到如 清单2 所示的 WSDL 片断。
清单 2. 用于 myMethod 的 RPC/编码的 WSDL
<message name="myMethodRequest"> <part name="x" type="xsd:int"/> </message> <message name="empty"/> <portType name="PT"> <operation name="myMethod"> <input message="myMethodRequest"/> <output message="empty"/> </operation> </portType> <binding .../> <!-- I won't bother with the details, just assume it's RPC/encoded. --> |
现在用“5”作为参数
x
的值来调用此方法。我们将发送一个与
清单3
类似的 SOAP
消息。
清单 3. 用于 myMethod 的 RPC/编码的 SOAP 消息
<soap:envelope> <soap:body> <myMethod> <x xsi:type="xsd:int">5</x> </myMethod> </soap:body> </soap:envelope> |
|
对于这个 RPC/编码的示例中的 WSDL 和 SOAP 消息,有许多需要注意的事项:
- WSDL 基本达到了尽可能地简单易懂的要求。
- 操作名出现在消息中,这样接收者就可以很轻松地把消息发送到方法的实现。
- 类型编码信息(比如
xsi:type="xsd:int"
)通常就是降低吞吐量性能的开销。 - 您不能简单地检验此消息的有效性,因为只有
<x xsi:type="xsd:int">5</x>
行包含在 Schema 中定义的内容;其余的soap:body
内容都来自 WSDL 定义。
有没有一种方法能够保留这些优点而消除其中的缺点呢?或许有。让我们来看一看 RPC/文字的样式。
|
|
用于我们的方法的 RPC/文字的 WSDL 看起来与 RPC/编码的 WSDL 几乎一样(请参见 清单4 )。只是绑定的用法由 编码 改为 文字 。仅此而已。
清单
4.
用于 myMethod 的 RPC/文字的 WSDL
<message name="myMethodRequest">
<part name="x" type="xsd:int"/>
</message>
<message name="empty"/>
<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>
<binding .../>
<!-- I won't bother with the details, just assume it's RPC/
literal
. -->
|
RPC/文字的 SOAP 消息又是怎样的呢(请参见 清单 5 )?这里的更改要多一点。去掉了类型编码。
清单
5.
用于 myMethod 的
RPC/文字的 SOAP
消息
<soap:envelope> <soap:body> <myMethod> <x>5</x> </myMethod> </soap:body> </soap:envelope> |
下面是这种方法的优点和缺点:
- WSDL 还是基本达到了尽可能地简单易懂的要求。
- 操作名仍然出现在消息中。
- 去掉了类型编码。
- 您仍然不能简单地检验此消息的有效性,因为只有
<x xsi:type="xsd:int">5</x>
行包含在 Schema 中定义的内容;其余的soap:body
内容都来自 WSDL 定义。
文档样式如何呢?它们能够帮助克服这些困难吗?
|
|
我不知道有谁懂得这种方法的真正含义。我也不知道这种方法的任何实现。它将可能从 WSDL 的后续版本中消失。所以我们还是讨论别的吧。
|
|
文档/文字的 WSDL 对 RPC/文字的 WSDL 作了一些更改。它们之间的不同之处显示在 清单6 中。
<types> <schema> <element name="xElement" type="xsd:int"/> </schema> </types> <message name="myMethodRequest"> <part name="x" element="xElement" /> </message> <message name="empty"/> <portType name="PT"> <operation name="myMethod"> <input message="myMethodRequest"/> <output message="empty"/> </operation> </portType> <binding .../> <!-- I won't bother with the details, just assume it's document /literal. --> |
清单7.
用于 myMethod 的文档/文字的 SOAP 消息
<soap:envelope> <soap:body> <xElement>5</xElement> </soap:body> </soap:envelope> |
|
下面是这种方法的优点和缺点:
- 没有编码信息
- 您可以在最后用任何 XML
检验器检验此消息的有效性。
soap:body
(<xElement>5</xElement>
)中每项内容都定义在 Schema 中。
- WSDL 变得有些复杂。不过,这是一个非常小的缺点,因为 WSDL 并没有打算由人来读取。
- SOAP 消息中缺少操作名。而如果没有操作名,发送就可能比较困难,并且有时变得不可能。
文档/文字的样式看起来似乎只是重新安排了 RPC/文字的模型的优点和缺点。您可以检验消息的有效性,但是您失去了操作名。有没有一种方法可以改进这一点呢?有的。它就是文档/文字包装的样式。
|
|
在我说明文档/文字包装的样式的含义之前,让我给您展示 清单 8 和 清单9 中的 WSDL 和 SOAP 消息。
清单8.
用于 myMethod 的文档/文字包装的 WSDL
<types> <schema> <element name="myMethod"/> <complexType> <sequence> <element name="x" type="xsd:int"/> </sequence> </complexType> </element> </schema> </types> <message name="myMethodRequest"> <part name=" parameters " element=" myMethod "/> </message> <message name="empty"/> <portType name="PT"> <operation name="myMethod"> <input message="myMethodRequest"/> <output message="empty"/> </operation> </portType> <binding .../> <!-- I won't bother with the details, just assume it's document/literal. --> |
WSDL Schema 现在把参数放在包装中(请参见 清单9 )。
清单:9.
用于 myMethod 的文档/文字包装的 SOAP 消息
<soap:envelope> <soap:body> <myMethod> <x>5</x> </myMethod> </soap:body> </soap:envelope> |
注意到此 SOAP
消息看起来非常类似于 RPC/文字的 SOAP
消息。您可能会说,它看起来与 RPC/文字的 SOAP
消息是完全一样的,不过,这两种消息之间存在着微妙的区别。在
RPC/文字的 SOAP 消息中,
<soap:body>
的
<myMethod>
子句是操作的名称。在文档/文字包装的 SOAP 消息中,
<myMethod>
子句是单个输入消息的组成部分引用的元素的名称。因此,包装的样式具有这样的一个特征,输入元素的名称与操作的名称是相同的。此样式是把操作名放入 SOAP
消息的一种巧妙方式。
文档/文字包装的样式的特征有:
- 输入消息只有一个组成部分。
- 该部分就是一个元素。
- 该元素有与操作相同的名称。
- 该元素的复杂类型没有属性。
下面是这种方法的优点和缺点:
- 没有编码信息。
- 出现在 soap:body 中的每项内容都是由 Schema 定义的,所以您现在可以很容易地检验此消息的有效性。
- 方法名又出现在 SOAP 消息中。
- WSDL 甚至更复杂,但是这仍然是一个非常小的缺点。
如您所见,文档/文字包装的样式还是有一些缺点,不过与优点比起来,它们都显得无足轻重。
|
这种包装的样式来源于
Microsoft。没有定义这种样式的规范;所以虽然这种样式是一个好的东西,但不幸的是,为了与
Microsoft
和其他公司的实现进行互操作,现在惟一的选择就是根据 Microsoft WSDL
的输出来猜测它是如何工作的。文档/文字包装的样式也实现在 IBM WebSphere SDK for Web Services
中(请参见
参考资料
)。在这个示例中,样式是相当明显的;但是也存在个别情况,在这些情况中,由于缺少定义而导致需要操作的适当事项不够特别清晰。我们希望看到的最理想的情况就是将来能有像 Web
服务互操作组织(Web Services Interoperability Organization)这样的独立团体来帮助对此进行稳定化和标准化。
|
|
至此,本文已经给了您这样的一个印象,文档/文字包装的样式是最好的方法。而实际的情况往往确实如此。不过,仍然存在着一些情况,在这些情况下,您最好是换一种别的样式。
如果您已经重载了操作,就不能采用文档/文字包装的样式。
想象一下,除了我们一直在使用的方法之外,还有另一种方法,请参见 清单10 。
public void myMethod(int x);
public void myMethod(int x, String y);
|
|
WSDL 允许重载的操作。但是当您添加包装的样式到 WSDL 时,需要元素有与操作相同的名称,并且在 XML 中不能有两个名称相同的元素。所以您必须采用文档/文字非包装的样式或某种 RPC 样式。
由于文档/文字非包装的样式没有提供操作名,所以在有些情况下,您将需要采用某种 RPC
样式。比如说
清单11
中的一组方法。
public void myMethod(int x);
public void myMethod(int x, String y);
public void someOtherMethod(int x);
|
现在假定您的服务器接收到文档/文字的 SOAP
消息(您可以回过头在
清单
7
中看一看它)。服务器应该发送哪一种方法呢?所有您能确切知道的就是,它一定不是
myMethod(int x, String x)
,因为消息只有一个参数,而这种方法需要两个参数。它可能是其他两种方法中的一种。采用文档/文字的样式,您没有办法知道是哪一种方法。
假定服务器接收到一个
RPC/文字的消息(比如
清单5
中的),而不是文档/文字的消息。对于这种消息,服务器很容易决定把它发送到哪一种方法。您知道操作名是
myMethod
,并且也知道只有一个参数,所以它必定是
myMethod(int x)
。
采用 RPC/编码的理由有很多。其中两个主要的原因是:
- 数据图形
- 多态性
数据图形
设想您有一个二进制树,其中的节点定义在 清单12 中。
<complexType name="Node"> <sequence> <element name="name" type="xsd:string"/> <element name="left" type="Node" xsd:nillable="true"/> <element name="right" type="Node" xsd:nillable="true"/> </sequence> </complexType> |
根据这种节点定义,我们可以构造一个树形结构,它的根节点 A 通过它左边和右边的的链接可以指向节点 B(请参见 图1 )。
发送数据图形的标准方式是使用 href 标记,它是 RPC/编码的样式( 清单13 )的一部分。
<A> <name>A</name> <left href="12345"/> <right href="12345"/> </A> <B id="12345"> <name>B</name> <left xsi:nil="true"/> <right xsi:nil="true"/> </B> |
在任何文字的样式中,href 属性都是不可用的,这样图形链接就不再起作用了( 清单14 和 图2 )。您仍然有一个根节点 A,它从左边指向一个节点 B,从右边指向另一个节点 B。这两个 B 节点是等同的,但它们不是相同的节点。是复制了数据而不是引用了两次数据。
<A> <name>A</name> <left> <name>B</name> <left xsi:nil="true"/> <right xsi:nil="true"/> </left> <right> <name>B</name> <left xsi:nil="true"/> <right xsi:nil="true"/> </right> </A> |
在文字样式中,您可以通过各种方法构造图形,但是却没有标准的方法;所以您做的任何事情很可能不能与网络中其他端点上的服务进行互操作。
多态性
看一看 清单15 中使用多态性 Schema 的 WSDL。
<types> <schema> <complexType name="animal"> <sequence> <element name="name" type="xsd:string"/> </sequence> </complexType> <complexType name="dog"> <complexContent mixed="false"> <extension base="animal"> <sequence> <element name="breed" type="xsd:string"/> </sequence> </extension> </complexContent> </complexType> </schema> </types> <message name="in"> <part name="trainee" type="animal"/> </message> <message name="empty"/> <portType name="AnimalTrainer"> <operation name="train"> <input message="in"/> <output message="empty"/> </operation> </portType> |
当您把一个 dog 的实例传送给 train 操作时,所生成的 SOAP 消息必须包含类型编码信息,这样接收终端才能知道它所接收的是 animal 的哪一个扩展(请参见 清单16 )。这种类型编码信息可用在 RPC/编码的样式中。
<soap:envelope> <soap:body> <train> <trainee xsi:type="Dog"> <name>Bob</name> <breed>Bloodhound</breed> </trainee> </train> </soap:body> </soap:envelope> |
|
|
有四种绑定样式(其实真正有五种,不过文档/编码的样式没有什么意义)。虽然每种样式都有自己的用武之地,但是在大多数情况下,最好的样式是文档/文字包装的样式。
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文
.
- 阅读
WSDL 的规范
Web
服务描述语言(Web Services Description Language,WSDL 1.1
)。
-
看一看介绍 SOAP 1.2 规范的
SOAP 1.2
入门
。
-
获取
IBM WebSphere SDK for Web Services(WSDK)版本 5.1
,它是一个用于创建、发现、调用和测试 Web
服务的工具包。您可以通过此链接下载 WSDK 5.0.1
和大量的教程。
-
Java API for
XML-Based RPC(JAX-RPC)下载和规范
提供了指向 JAX-RPC 1.0
规范本身以及 javadocs、类文件和 Sun 的 JAX-RPC
参考实现的链接。
-
浏览
WS-I(Web Services
Interoperability)
组织的 Web 页面。
-
阅读
WS-I
的 基本概要 1.0(Basic Profile 1.0)
。
Russell Butek 是 IBM WebSphere Web 服务引擎的一名开发人员。他同时也是 JAX-RPC Java Specification Request(JSR)专家组中 IBM 的代表。他参与实现了 Apache 的 AXIS SOAP 引擎,并且推动 AXIS 1.0 遵循 JAX-RPC 1.0。此前,他是 IBM CORBA ORB 的一名开发人员和许多 OMG 特别工作组(他担任职务)、核心特别工作组和互操作性特别工作组中 IBM 的代表。您可以通过 butek at us.ibm.com 与 Russell 联系。 |
发表评论
-
webservice和soap小原理
2009-07-21 16:56 735什么是Web Services ... -
基于xfire的web service搭建
2009-07-21 17:22 701标题:基于xfire的web service搭建 出处:小强 ... -
【SSI开发总结.10】eclispe中使用XFire框架调用WebService
2009-08-20 15:54 831在SSI开发中,要求读取访问者IP所在地,需要调用WebSer ... -
WebServices入门
2010-01-22 10:01 671WebServices入门 什么是w ... -
webservice的原理及概念
2010-01-25 16:48 679webservice的原理及概念 1 webser ... -
Web 服务提示与技巧: JAX-RPC 与 JAX-WS 的比较
2010-01-26 08:53 785JAX-WS 2.0 是 JAX-RPC 1.1 的后续版本。 ... -
用于 JAX-WS 应用程序的 wsgen 命令
2010-01-26 15:49 721当从 Java 代码启动时,wsgen 命令行工具将生成针对 ... -
设计与开发 JAX-WS 2.0 Web 服务
2010-01-27 12:54 729开始之前 关于本教程 在本教程中,我们将设计和 ... -
利用 WAS 6.1 WebService 功能部件包开发 JAX-WS 2.0 Web services
2010-02-23 13:29 828引言 JAX-WS 2.0 的全称为 Java A ... -
Web Service单元测试工具实例介绍之SoapUI
2010-06-23 16:27 764SoapUI 是当前比较简单实用的开源Web Service ... -
wsgen与wsimport命令说明
2010-02-23 13:32 611wsgen wsgen 是在JDK的bin目录下的一个 ...
相关推荐
WSDL,全称为Web Services Description Language,是用于描述Web服务的一种XML格式。它定义了服务的接口,包括服务提供的操作、消息格式、通信协议以及服务的位置。WSDL文件是Web服务客户端和服务提供者之间进行交互...
Web 服务描述语言(WSDL,Web Service Description Language)是一种XML格式,用于定义网络服务的接口,包括服务的位置、操作及如何与这些服务交互。在WSDL文档中,SOAP(Simple Object Access Protocol)绑定部分...
WSDL(Web Services Description Language),即Web服务描述语言,是一种基于XML的标准语言,用于描述Web服务及其交互方式。它提供了关于如何访问Web服务的信息,包括服务的端点地址、可用的操作以及相关的消息格式...
然而,为了实现真正的互操作性,不仅需要一种通用的数据交换格式,还需要一种描述服务接口和绑定细节的语言,这就是WSDL(Web Services Description Language)的由来。 WSDL通过提供一个统一的方法来描述服务接口...
其中,WSDL(Web Services Description Language)是用于定义Web服务接口的一种XML格式,它描述了服务的位置、提供的操作以及如何调用这些操作。在开发过程中,为了将WSDL定义的服务转换为可执行的Java代码,我们...
Web Service 描述语言(WSDL,Web Service Description Language)是一种基于XML的语言,专门用来定义Web服务的接口。WSDL文件提供了详细的规范,让服务提供者和服务消费者能够理解如何交互,从而促进不同系统间的...
首先,我们需要了解处理WSDL文档的两种基本方法:一是结合编程语言(如Java或C)和XML解析API(SAX或DOM)直接操作文档内容;二是使用XSLT转换,定义输入到输出的转换规则。XSLT的优势在于它的通用性、简洁性和广泛...
Web服务描述语言(WSDL,Web Services Description Language)是一种XML格式,用于定义网络服务的接口。它是理解Web服务的关键组成部分,让服务消费者能够了解如何与服务进行交互。在这个例子中,我们将深入探讨WSDL...
在IT行业中,Web Service是一种基于XML的通信标准,它允许不同的应用程序之间进行数据交换,而不管它们是由何种编程语言或操作系统构建的。WSDL(Web Services Description Language)是描述Web Service接口的语言,...
在IT行业中,Web服务是应用程序之间进行通信的一种标准方式,而WSDL(Web Services Description Language)则是一种XML格式,用于定义Web服务的具体接口。本文将详细介绍如何使用Eclipse WTP工具创建WSDL文件以及...
Web服务描述语言(WSDL,Web Services Description Language)是一种XML格式,用于定义网络服务的接口。它是WebService调用过程中的核心规范,允许服务提供者声明服务的可用操作、消息格式以及如何通过网络进行通信...
Web服务(Web Services)是一种基于互联网的、平台独立的交互方式,它允许不同的应用程序之间进行数据交换和功能调用。WSDL(Web Services Description Language)是用于定义Web服务接口的标准XML格式,它描述了服务...
目前Web服务的相关标准是WSDL【Web服务描述语言】,一种标准的类似XML Schema的语言,用它来详细说明Web服务和SOAP【简单对象访问协议】。两份报告:研究报告,实验报告 研究报告包含内容: (1)概述 (2)问题...
Document Literal风格是一种不依赖于WSDL类型系统的调用方式,它直接处理XML文档。 在Axis2中,我们可以直接构建SOAP消息并发送请求,如下: ```java import org.apache.axis2.AxisFault; import org.apache.axis2...
HTML,即HyperText Markup Language(超文本标记语言),是一种被广泛应用于构建网页的标准标记语言。HTML由一系列的元素组成,这些元素通过标签表示,用来告诉浏览器如何展示网页内容。 ##### 2. HTML标签 HTML...
Disco Language WSDL Server 是一个开源项目,主要目的是提供一种方式来展示和处理WSDL(Web服务描述语言)文档。WSDL是一种XML格式,用于定义网络服务的接口,包括服务的位置、使用的消息协议以及如何调用这些服务...
Web Service Description Language(WSDL)是一种XML格式的规范,用于定义网络服务的接口。它详细描述了服务的位置、提供的操作以及如何调用这些操作。WSDL文件通常包含了服务的输入、输出消息类型,以及服务绑定到...
1. XSLT 基础:XSLT(Extensible Stylesheet Language Transformations)是一种基于 XML 的样式表语言,用于将 XML 文档转换为其他格式的文档。 2. 选择语句:XSLT 中的选择语句包括 xsl:case、xsl:switch、xsl:...
WebService 面试题 WebService 是一种跨编程语言和跨操作系统平台的远程调用的技术。它允许不同的编程语言和操作系统平台之间的...WSDL 是用于描述WebService 的定义语言,而SOAP 是WebService 所使用的一种传输协议。
- **文件放置**:将`wsdl2.exe`、`typemap.dat`、WSDL文档和样式表文件放在同一个文件夹中。 - **路径修改**:修改WSDL文档中的`schemaLocation`属性,将其指向本地的实际路径。例如,在`event.wsdl`中将`...