0

我正在尝试使用 Spyne 实现现有的 Web 服务。我有一个带有两个参数的函数,其 WSDL 应如下所示:

<wsdl:types>
  <xs:schema targetNamespace="http://example.com/" elementFormDefault="qualified" >
    <s:element name="getData">
      <s:complexType>
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="login" type="s:string"/>
          <s:element minOccurs="0" maxOccurs="1" name="password" type="s:string"/>
        </s:sequence>
      </s:complexType>
    </s:element>
[...]

我的代码包含此函数的以下装饰器:

@rpc(String(min_occurs=0, max_occurs=1, nillable=False),
     String(min_occurs=0, max_occurs=1, nillable=False),
     _returns=Unicode)
def getData(self, login, password):
     return 'data'

生成此 WSDL:

<wsdl:types>
    <xs:schema elementFormDefault="qualified" targetNamespace="http://example.com/">
        <xs:complexType name="getData">
            <xs:sequence>
                <xs:element minOccurs="0" name="login" type="xs:string" />
                <xs:element minOccurs="0" name="password" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
[...]

因此,我只有一个简单的 complexType,而不是包含 complexType 的元素。这种差异会导致与现有实现兼容的客户端出现问题。有没有办法使用 Spyne 将 complexType 包装在一个元素中?

4

1 回答 1

0

Spyne 的 wsdl 应该同时包含:

<xs:complexType name="getData"> (...) </xs:complexType>

<s:element name="getData" type="tns:getData">

将 complexType 放在元素内部相当于将其放在外部并进行适当的引用,因此您的解析器应该能够处理这两种形式。

如果您对客户端没有任何控制权(在这种情况下经常出现这种情况),那么您别无选择,只能修补 Spyne。如果你想走那条路,请加入 spyne ml ( http://lists.spyne.io/listinfo/people ) 以便我们交谈。

于 2015-04-30T06:07:44.750 回答