使用soaplib生成错误的(?)数据类型

时间:2011-10-10 09:30:38

标签: python wsdl soaplib

我遇到了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生成两个类,其属性为字符串

有没有人知道我是否可以调整我的Python声明,以便在客户端避免使用complexType并获得真正的整数数据类型

3 个答案:

答案 0 :(得分: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中你无法获得原始整数数据。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

所以,我用这种方式进行monkeypatch:

from soaplib.serializers.primitive import Integer

class BetterInteger(Integer):
   __type_name__ = "int"

Integer = BetterInteger

然后继续生活。

但是,XSD规范定义了'integer':“表示有符号整数。值可以以可选的”+“或” - “符号开头。从十进制数据类型派生。”和'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]