TypeNotFoundError after import namespace
Asked Answered
V

1

6

My application in Python(2.7) should use a client for consume a SOAP web service as is described on a WSDL(Generated by Magento(1.7.0) and posted at the end).

For this task Suds(4.0) was chosen, when I tried to connect with these code:

from suds.client import Client       
client = Client(url)

I received a TypeNotFound error due to a well known problem described here https://fedorahosted.org/suds/wiki/Documentation#FIXINGBROKENSCHEMAs

Then I changed my code to:

from suds.client import Client
from suds.xsd.doctor import Import, ImportDoctor
#Fixing the import
imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
imp.filter.add('urn:Magento')
client = Client(self.url, plugins=[ImportDoctor(imp)] )
#Now Authentication
session = client.service.login(username, password)
#Call a method
client.service.call(session,'catalog_product.info',['123'])

However, now arose a new Exception:

File "/home/david.gonzalez/.virtualenvs/testlib/lib/python2.7/site- packages/suds/mx/literal.py", line 86, in start
    raise TypeNotFound(content.tag)
suds.TypeNotFound: Type not found: 'args'

I don't understand, why it cannot find the type of 'args' if is explicit in the wsdl:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:typens="urn:Magento" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Magento" targetNamespace="urn:Magento">
   <types>
      <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Magento">
         <!--
 <import namespace="http://schemas.xmlsoap.org/soap/encoding/" schemaLocation="http://schemas.xmlsoap.org/soap/encoding/" /> 
-->
         <complexType name="FixedArray">
            <complexContent>
               <restriction base="soapenc:Array">
                  <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:anyType[]" />
               </restriction>
            </complexContent>
         </complexType>
      </schema>
   </types>
   <message name="call">
      <part name="sessionId" type="xsd:string" />
      <part name="resourcePath" type="xsd:string" />
      <part name="args" type="xsd:anyType" />
   </message>
   <message name="callResponse">
      <part name="callReturn" type="xsd:anyType" />
   </message>
   <message name="multiCall">
      <part name="sessionId" type="xsd:string" />
      <part name="calls" type="typens:FixedArray" />
      <part name="options" type="xsd:anyType" />
   </message>
   <message name="multiCallResponse">
      <part name="multiCallReturn" type="typens:FixedArray" />
   </message>
   <message name="endSession">
      <part name="sessionId" type="xsd:string" />
   </message>
   <message name="endSessionResponse">
      <part name="endSessionReturn" type="xsd:boolean" />
   </message>
   <message name="login">
      <part name="username" type="xsd:string" />
      <part name="apiKey" type="xsd:string" />
   </message>
   <message name="loginResponse">
      <part name="loginReturn" type="xsd:string" />
   </message>
   <message name="resources">
      <part name="sessionId" type="xsd:string" />
   </message>
   <message name="resourcesResponse">
      <part name="resourcesReturn" type="typens:FixedArray" />
   </message>
   <message name="globalFaults">
      <part name="sessionId" type="xsd:string" />
   </message>
   <message name="globalFaultsResponse">
      <part name="globalFaultsReturn" type="typens:FixedArray" />
   </message>
   <message name="resourceFaults">
      <part name="resourceName" type="xsd:string" />
      <part name="sessionId" type="xsd:string" />
   </message>
   <message name="resourceFaultsResponse">
      <part name="resourceFaultsReturn" type="typens:FixedArray" />
   </message>
   <message name="startSession" />
   <message name="startSessionResponse">
      <part name="startSessionReturn" type="xsd:string" />
   </message>
   <portType name="Mage_Api_Model_Server_HandlerPortType">
      <operation name="call">
         <documentation>Call api functionality</documentation>
         <input message="typens:call" />
         <output message="typens:callResponse" />
      </operation>
      <operation name="multiCall">
         <documentation>Multiple calls of resource functionality</documentation>
         <input message="typens:multiCall" />
         <output message="typens:multiCallResponse" />
      </operation>
      <operation name="endSession">
         <documentation>End web service session</documentation>
         <input message="typens:endSession" />
         <output message="typens:endSessionResponse" />
      </operation>
      <operation name="login">
         <documentation>Login user and retrive session id</documentation>
         <input message="typens:login" />
         <output message="typens:loginResponse" />
      </operation>
      <operation name="startSession">
         <documentation>Start web service session</documentation>
         <input message="typens:startSession" />
         <output message="typens:startSessionResponse" />
      </operation>
      <operation name="resources">
         <documentation>List of available resources</documentation>
         <input message="typens:resources" />
         <output message="typens:resourcesResponse" />
      </operation>
      <operation name="globalFaults">
         <documentation>List of resource faults</documentation>
         <input message="typens:globalFaults" />
         <output message="typens:globalFaultsResponse" />
      </operation>
      <operation name="resourceFaults">
         <documentation>List of global faults</documentation>
         <input message="typens:resourceFaults" />
         <output message="typens:resourceFaultsResponse" />
      </operation>
   </portType>
   <binding name="Mage_Api_Model_Server_HandlerBinding" type="typens:Mage_Api_Model_Server_HandlerPortType">
      <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
      <operation name="call">
         <soap:operation soapAction="urn:Mage_Api_Model_Server_HandlerAction" />
         <input>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </input>
         <output>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </output>
      </operation>
      <operation name="multiCall">
         <soap:operation soapAction="urn:Mage_Api_Model_Server_HandlerAction" />
         <input>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </input>
         <output>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </output>
      </operation>
      <operation name="endSession">
         <soap:operation soapAction="urn:Mage_Api_Model_Server_HandlerAction" />
         <input>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </input>
         <output>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </output>
      </operation>
      <operation name="login">
         <soap:operation soapAction="urn:Mage_Api_Model_Server_HandlerAction" />
         <input>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </input>
         <output>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </output>
      </operation>
      <operation name="startSession">
         <soap:operation soapAction="urn:Mage_Api_Model_Server_HandlerAction" />
         <input>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </input>
         <output>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </output>
      </operation>
      <operation name="resources">
         <soap:operation soapAction="urn:Mage_Api_Model_Server_HandlerAction" />
         <input>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </input>
         <output>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </output>
      </operation>
      <operation name="globalFaults">
         <soap:operation soapAction="urn:Mage_Api_Model_Server_HandlerAction" />
         <input>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </input>
         <output>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </output>
      </operation>
      <operation name="resourceFaults">
         <soap:operation soapAction="urn:Mage_Api_Model_Server_HandlerAction" />
         <input>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </input>
         <output>
            <soap:body namespace="urn:Magento" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
         </output>
      </operation>
   </binding>
   <service name="MagentoService">
      <port name="Mage_Api_Model_Server_HandlerPort" binding="typens:Mage_Api_Model_Server_HandlerBinding">
         <soap:address location="http://127.0.0.1/magento/index.php/api/soap/index/" />
      </port>
   </service>
</definitions>

My feeling was a mistake with the name of the namespace, however , I have already tried this thread with the same results: SOAP suds and the dreaded schema Type Not Found error

Veronicaveronika answered 24/6, 2014 at 23:1 Comment(1)
Can you edit the literal.py file and add some print statements to see what information is actually being passed in? if content.type is None: name = content.tag if name.startswith('_'): name = '@'+name[1:] content.type = self.resolver.find(name, content.value) if content.type is None: raise TypeNotFound(content.tag)Rhapsodist
U
1

This is your call:

client.service.call(session,'catalog_product.info',['123']) # <--- ['123']

maybe it needs xsd:anyType[] to work; i.o.w. array of anyType rather than anyType.

<message name="call">
   <part name="sessionId" type="xsd:string" />
   <part name="resourcePath" type="xsd:string" />
   <part name="args" type="xsd:anyType[]" />
</message>
Unjust answered 21/2, 2015 at 8:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.