1

我遇到了soaplib的问题。我有一个 Web 服务提供的以下功能:

@soap(Integer, Integer, _returns=Integer)
def test(self, n1, n2):
    return n1 + n2

生成的 WSDL 文件中数据类型的相应声明是

<xs:complexType name="test">
  <xs:sequence>
    <xs:element name="n1" type="xs:integer" minOccurs="0" nillable="true"/>
    <xs:element name="n2" type="xs:integer" minOccurs="0" nillable="true"/>   
  </xs:sequence> 
</xs:complexType> 
<xs:complexType> name="testResponse">   
  <xs:sequence>
    <xs:element name="testResult" type="xs:integer" minOccurs="0" nillable="true"/>     
  </xs:sequence> 
</xs:complexType>

当我使用一些 IDE(Visual Studio、PowerBuilder)从该 WSDL 文件生成代码时,无论 IDE 是什么,它都会生成两个用于 test 和 testResponse 的类,它们的属性是Strings

有谁知道我是否可以调整我的 Python 声明,以便避免 complexType 并在客户端获取真正的Integer 数据类型?

4

3 回答 3

2

我检查了你的代码,但我得到了相同的输出。我正在使用suds来解析这些值。

In [3]: from suds import client

In [4]: cl = client.Client('http://localhost:8080/?wsdl')

In [5]: cl.service.test(10,2)
Out[5]: 12

但是当我检查该值的类型时。

In [6]: type(cl.service.test(10,2))
Out[6]: <class 'suds.sax.text.Text'>

因此 SOAPLIB 将返回字符串,但您可以从该数据的类型转换它。

我通过写这个来检查响应

@soap(_returns=Integer)
    def test(self):
        return 12

所以我进入了 Firefox 响应的 SOA 客户端插件

<?xml version='1.0' encoding='utf-8'?>
<senv:Envelope 
      xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing" 
      xmlns:plink="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" 
      xmlns:xop="http://www.w3.org/2004/08/xop/include"                
      xmlns:senc="http://schemas.xmlsoap.org/soap/encoding/" 
      xmlns:s12env="http://www.w3.org/2003/05/soap-envelope/"  
      xmlns:s12enc="http://www.w3.org/2003/05/soap-encoding/"  
      xmlns:xs="http://www.w3.org/2001/XMLSchema"    
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/"  
      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> 

      <senv:Body>
           <tns:testResponse>
               <tns:testResult>
                   12
               </tns:testResult>
           </tns:testResponse>
     </senv:Body>
</senv:Envelope>

您无法从 XML 获取原始整数数据。

于 2011-10-10T10:17:17.697 回答
1

好的,并不是所有的 XSD 数据类型都在soaplib 中定义。整数在soaplib 中定义,在WSDL 文件中被视为整数,.NET 框架(由PowerBuilder 使用)无法理解。对于 .NET/PowerBuilder,Int 是可以的,但soaplib 没有在soaplib 中定义。

因此,我从 soaplib 转到rpclib。这些库非常接近(一个是另一个的分支)。

于 2011-10-11T09:08:58.780 回答
0

与同样的事情作斗争,但无法摆脱soaplib。

所以,我这样猴子补丁:

from soaplib.serializers.primitive import Integer

class BetterInteger(Integer):
   __type_name__ = "int"

Integer = BetterInteger

然后继续生活。

但是,XSD 规范定义了两个“整数”:“表示有符号整数。值可以以可选的“+”或“-”符号开头。派生自十进制数据类型。和 'int' “表示 [-2,147,483,648, 2,147,483,647] 范围内的 32 位有符号整数。派生自 long 数据类型。”

所以,更好的解决方案是:

from soaplib.serializers.primitive import Integer

class Int32(Integer):
   __type_name__ = "int"

并使用您的新“Int32”类输入您的输入参数。

[soaplib 1.0.0]

于 2012-12-13T22:59:14.450 回答