0

I have a Python script that work with some third-party software through SOAP interface using suds 0.4.1-3.el6.

Everything worked until a recent update of the software. Now all scripts like:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#

import logging
from suds import WebFault
from suds.client import Client

logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)

client = Client("http://localhost:80/admin/soap/api3.wsdl")
#print client.location
#client.location = 'http://localhost:34012/'

print client

ends with:

Traceback (most recent call last):
  File "print.py", line 18, in <module>
    client = Client("http://localhost:80/admin/soap/api3.wsdl")
  File "/usr/lib/python2.6/site-packages/suds/client.py", line 119, in __init__
    sd = ServiceDefinition(self.wsdl, s)
  File "/usr/lib/python2.6/site-packages/suds/servicedefinition.py", line 58, in __init__
    self.paramtypes()
  File "/usr/lib/python2.6/site-packages/suds/servicedefinition.py", line 137, in paramtypes
    item = (pd[1], pd[1].resolve())
  File "/usr/lib/python2.6/site-packages/suds/xsd/sxbasic.py", line 63, in resolve
    raise TypeNotFound(qref)
suds.TypeNotFound: Type not found: '(soapDiscountAddons, http://www.w3.org/2001/XMLSchema, )'

Software support said "our WSDL file is fine, ask suds developer", so I need help to investigate this problem.

Previous working files:
https://dl.dropbox.com/u/4299326/py/20130225.wsdl/old/api3.wsdl
https://dl.dropbox.com/u/4299326/py/20130225.wsdl/old/encoding.xml

New crashing files:
https://dl.dropbox.com/u/4299326/py/20130225.wsdl/new/api3.wsdl
https://dl.dropbox.com/u/4299326/py/20130225.wsdl/new/encoding.xml

Bogdan
  • 23,890
  • 3
  • 69
  • 61
brammator
  • 293
  • 2
  • 10

1 Answers1

3

Software support said "our WSDL file is fine, ask suds developer"

I don't think that's correct. The Type not found: '(soapDiscountAddons, http://www.w3.org/2001/XMLSchema, )' message suds is showing is correct.

By looking at your WSDL, the soapDiscountAddons is in the urn:api3 namespace so you need to mention that when you use it. The problem is here:

<!-- operation response element -->
<element name="getDiscountAddonsResponse">
  <complexType>
    <sequence>
      <element name="ret" type="soapDiscountAddons" minOccurs="1" maxOccurs="unbounded"/>
    </sequence>
  </complexType>
</element>
<!-- operation request element -->
<element name="insupdDiscountAddon">
  <complexType>
    <sequence>
      <element name="val" type="soapDiscountAddons" minOccurs="1" maxOccurs="1"/>
    </sequence>
  </complexType>
</element>

Because you didn't prefix the type, the current namespace is used which is http://www.w3.org/2001/XMLSchema, not urn:api3. Instead of looking for soapDiscountAddons@urn:api3 where the type is, suds is trying to find a soapDiscountAddons@http://www.w3.org/2001/XMLSchema element which of course doesn't exist.

This should fix it:

<element name="getDiscountAddonsResponse">
 <complexType>
  <sequence>
    <element name="ret" type="lbapi:soapDiscountAddons" minOccurs="1" maxOccurs="unbounded"/>
    <!--                      ^^^^^ you are missing this  -->
  </sequence>
 </complexType>
</element>
<!-- operation request element -->
<element name="insupdDiscountAddon">
 <complexType>
  <sequence>
   <element name="val" type="lbapi:soapDiscountAddons" minOccurs="1" maxOccurs="1"/>
   <!--                      ^^^^^ you are missing this  -->
  </sequence>
 </complexType>
</element>
Bogdan
  • 23,890
  • 3
  • 69
  • 61