Python Web 服务开发者: Python SOAP 库,第 4 部分
2008-09-30 13:02:58 来源:WEB开发网看来该脚本不能处理 getAirFareQuote 操作的搜索返回结构中的复杂类型数组,如 WSDL 类型部分所示:
<complexType name="ArrayOfAirFareQuote">
<complexContent>
<restriction base="soapenc:Array">
<attribute wsdl:arrayType="impl:AirFareQuote[]" ref=
"soapenc:arrayType"/>
</restriction>
</complexContent>
</complexType>
<element nillable="true" type="impl:ArrayOfAirFareQuote" name=
"ArrayOfAirFareQuote"/>
<complexType name="ArrayOf_xsd_string">
<complexContent>
<restriction base="soapenc:Array">
<attribute wsdl:arrayType="xsd:string[]" ref=
"soapenc:arrayType"/>
</restriction>
</complexContent>
</complexType>
<element nillable="true" type="impl:ArrayOf_xsd_string" name=
"ArrayOf_xsd_string"/>
WSDL 数组类型或许是在 XML 中缺少编码 RPC 有效负载方面最著名的一个例子,这对于 ZSI 来说是自然而然的事情,不过,我们将在另一篇文章中对此进行讨论。注释掉上面的类型定义,而代之以伪 WXSDT string 类型 wsdl2py , wsdl2py 继而生成用看起来很显眼的代码包装的两个模块。不幸的是,查看这些代码并不能启发如何正确地编组输入数据参数,所以我们很遗憾地把它看作是一个失败。为了让我们从责骂中解脱出来,我们询问了一名开发人员,了解编组数据类型的困难,他的答复是这可能是 ZSI 中的一个缺陷,但是可望很快修复。
ZSI 包装器和尾声
一个尝试使用 ZSI 的开发人员至少会认为必须有一种便利的方法来利用丰富的底层 ZSI 接口。OSE 是一个分布式的、基于 Web 的应用程序的框架,它提供构建在 ZSI 之上的 SOAP 支持。 zsirpc 包是 OSE 的一部分,它提供了一个更友好的 ZSI 包装器,不过它只处理用类似于 XML-RPC 的方式编码的 Web 服务。最有意义的是,它为 ZSI 支持的布尔型、二进制(如用 BASE64 编码的)、日期、dateTime、时间和持久类型提供了直接的包装器,只不过,据我们所知,为了编写专门的结构,开发人员需要做许多额外的工作。
我们希望 zsirpc 中的一些代码可以放到 ZSI 本身中。这将给 RPC 样式的 Web 服务开发人员带来更多的便利。然而,也需要鼓励开发人员使用文档-文字样式的 Web 服务。我们提倡这种样式的 Web 服务已经有很长的时间了,而最好的结果是看到 Web 服务的主流最终能够朝着这个方向发展。从而允许开发人员用动态 XML 本身来表示消息,而不是一味地想方设法扩展单一的数据模型来进行跨平台和语言的通信,这样一不留神,就会陷入转换层的重重迷雾之中。
ZSI 不是惟一取得重大进展的 Python Web 服务库。SOAPpy 也在积极的开发之中,而 WSDL 同样是这项工作的重要组成部分。在不久的将来我们将看到 SOAPpy 中有哪些新的特征。
更多精彩
赞助商链接