`
txf2004
  • 浏览: 6885187 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

理解web服务模式(一):应该采用哪一种 WSDL样式?

阅读更多

RPC/编码、RPC/文字、文档/文字?应该采用哪一种?

WSDL 绑定样式可以是 RPC 样式或文档样式。用法可以是编码的,也可以是文字的。您如何决定使用哪一种样式/用法的组合呢?本文将帮助您解决这个问题。
Web 服务是通过 WSDL 文档来描述的。WSDL 绑定描述了如何把服务绑定到消息传递协议(特别是 SOAP 消息传递协议)。WSDL SOAP 绑定可以是 RPC 样式的绑定,也可以是文档样式的绑定。同样,SOAP 绑定可以有编码的用法,也可以有文字的用法。这给我们提供了四种样式/用法模型
1. RPC/编码
2. RPC/文字
3. 文档/编码
4. 文档/文字
除了这些样式之外,还有一种样式也很常见,它称为文档/文字包装的样式,算上这一种,在创建 WSDL 文件时您就有了五种绑定样式可以从中选择。您应该选择哪一种呢?
于本文的讨论,让我们从 清单1中的 Java 方法开始,并且对其应用 JAX-RPC Java-to-WSDL 规则(请参见 参考资料)。
清单 1. Java 方法
public void myMethod(int x);
RPC/编码
采用 清单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>
为了简单起见,在本文的大部分 XML 示例中,我省略了名称空间和前缀。不过,我还是使用了少数前缀,您可以假定它们是用下列名称空间进行定义的。
  • xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
对于这个 RPC/编码的示例中的 WSDL SOAP 消息,有许多需要注意的事项:
  • WSDL 基本达到了尽可能地简单易懂的要求。
  • 操作名出现在消息中,这样接收者就可以很轻松地把消息发送到方法的实现。
  • 类型编码信息(比如xsi:type="xsd:int")通常就是降低吞吐量性能的开销。
  • 您不能简单地检验此消息的有效性,因为只有<x xsi:type="xsd:int">5</x>行包含在 Schema 中定义的内容;其余的soap:body内容都来自 WSDL 定义。
有没有一种方法能够保留这些优点而消除其中的缺点呢?或许有。让我们来看一看 RPC/文字的样式。
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 RPC/文字的 WSDL 作了一些更改。它们之间的不同之处显示在 清单6中。

清单6. 用于 myMethod 的文档/文字的 WSDL
<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. -->
而现在的 SOAP 应该如 清单 7所示:

清单7. 用于 myMethod 的文档/文字的 SOAP 消息
<soap:envelope>
<soap:body>
<xElement>5</xElement>
</soap:body>
</soap:envelope>
关于消息组成部分的注意事项
我本来可以只更改绑定,就像我从 RPC/编码转到 RPC/所做的那样。它将是合法的 WSDL。然而,WS-I 基本概要(WS-I Basic Profile)(请参见 参考资料)规定文档/文字的消息的组成部分引用元素而不是类型,所以我遵循了 WS-I(并且此处使用元素部分可以很好地把我们带到关于文档/文字包装的样式的讨论)。
下面是这种方法的优点和缺点:
优点
  • 没有编码信息
  • 您可以在最后用任何 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

清单10. 用于文档/文字包装的问题方法
public void myMethod(int x);
public void myMethod(int x, String y);
WSDL 的下一个版本可能将不允许重载的操作。

相关推荐

    WSDL绑定样式各种组合优劣势比较及实验文档.zip

    目前Web服务的相关标准是WSDL【Web服务描述语言】,一种标准的类似XML Schema的语言,用它来详细说明Web服务和SOAP【简单对象访问协议】。两份报告:研究报告,实验报告 研究报告包含内容: (1)概述 (2)问题...

    XMLSpy 2011中文版破解补丁

    XMLSpy是所有XML编辑器中做得非常好的一个软件,支持WYSWYG。支持Unicode、多字符集,支持Well-formed和Validated两种类型的XML文档,支持...它用一种和具体语言无关的抽象方式定义了给定Web服务收发的有关操作和消息。

    XMLSPY 2010 企业版

     它用一种和具体语言无关的抽象方式定义了给定Web服务收发的有关操作和消息。  更多情况,可以看看 IBM 中文站:借助 RDF 增强 WSDL + ZDNET CHINA 特稿: 用WSDL定义Web服务 HTML 导入,将 HTML 网页分开导入成为 ...

    AltovaXMLSpy2006

    它用一种和具体语言无关的抽象方式定义了给定Web服务收发的有关操作和消息。 Java / C++ 代码生成器,这个可以从 XML Schemas 文档中生成 Java/C++ 代码。 集成 Tamino, Tamino 产品是世界第一套以纯粹且标准的...

    asp.net面试题

    第一种:new Class(); 第二种:覆盖方法 public new XXXX(){} 第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。 2.如何把一个array复制到arrayList里 foreach( object o in array )...

    ASP EXCEL导入SQL

    在Java语言中重要的两个以SOAP技术开始的网络服务框架XFire和Axis也把REST作为自己的另一种选择。它们的新的项目分别是ApacheCXF和Axis2.Java语言也制定关于REST网络服务规范:JAX-RS:JavaAPIforRESTfulWebServices...

    Java EE常用框架.xmind

    采用一种算法,将中英文本中的字符拆分开来,形成词汇,以待用户输入关健字后搜索 流程 步一:按分词器拆分出词汇 步二:去除停用词和禁用词 步三:如果有英文,把英文字母转为小写,即搜索不分大小写 ...

    使用Python下的XSLT API进行web开发的简单教程

    Christopher Dix 所开发的“Kafka — XSL SOAP 工具箱”(请参阅 参考资料)是一种用于构造 SOAP 端点的 XSLT 框架。它只涵盖了 SOAP 1.1,但 Kafka 端点演示了传递 UserLand SOAP 验证器(UserLand SOAP Validator...

    ZendFramework中文文档

    3.2.2. 高级使用:持久一个 DbTable 结果对象 3.2.3. 高级用法示例 3.3. 摘要式认证 3.3.1. 简介 3.3.2. 规范(Specifics) 3.3.3. 身份(Identity) 3.4. HTTP 认证适配器 3.4.1. 简介 3.4.2. 设计回顾 ...

    JavaScript高级教程

    第 1 章 JavaScript 是什么...............................................1 3 1.1 历史简述..............................................1 1.2 JavaScript 实现................................................

Global site tag (gtag.js) - Google Analytics