Search code examples
pythonwsdlsoaplib

Wrong (?) datatype generated with soaplib


I'm having a problem with soaplib. I've the following function provided by a web service :

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

The corresponding declaration for the datatypes in the generated WSDL file is

<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>

When I use some IDE (Visual Studio, PowerBuilder) to generate code from that WSDL file, whatever the IDE, it generates two classes for test and for testResponse, whose attributes are Strings.

Does anyone know if I can tweak my Python declaration so that I avoid complexType and obtain real Integer datatype on my client side?


Solution

  • Fought with the same thing, but couldn't move away from soaplib.

    So, I monkeypatch it this way:

    from soaplib.serializers.primitive import Integer
    
    class BetterInteger(Integer):
       __type_name__ = "int"
    
    Integer = BetterInteger
    

    And then move on with life.

    However, the XSD spec defines both 'integer': "Represents a signed integer. Values may begin with an optional "+" or "-" sign. Derived from the decimal datatype." and 'int' "Represents a 32-bit signed integer in the range [-2,147,483,648, 2,147,483,647]. Derived from the long datatype."

    So, the better solution is:

    from soaplib.serializers.primitive import Integer
    
    class Int32(Integer):
       __type_name__ = "int"
    

    And use your new 'Int32' class to type your input parameters.

    [soaplib 1.0.0]