2014-06-24 6 views
6

Meine Anwendung in Python (2.7) sollte einen Client für die Verwendung eines SOAP-Webdienstes verwenden, wie in einer WSDL (Generated by Magento (1.7.0) und am Ende veröffentlicht) beschrieben.TypeNotFoundError nach Import Namespace

für diese Aufgabe Suds (4,0) gewählt, als ich mit diesem Code zu verbinden versucht:

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

ich aufgrund eines wohlbekanntes Problem hier beschrieben https://fedorahosted.org/suds/wiki/Documentation#FIXINGBROKENSCHEMAs einen TypeNotFound Fehler empfing

ich dann änderte meinen Code:

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']) 

entstand jedoch eine neue Ausnahme:

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' 

Ich verstehe nicht, warum es nicht die Art von ‚args‘ finden kann, wenn in der WSDL-Datei explizit:

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

Mein Gefühl ein Fehler mit dem Namen des Namespace war, ich aber, hat bereits dieses Thema mit dem gleichen Ergebnis versucht: SOAP suds and the dreaded schema Type Not Found error

+0

Können Sie die Datei literal.py bearbeiten und einige Druckanweisungen hinzufügen, um festzustellen, welche Informationen tatsächlich übergeben werden? 'wenn content.type ist None: name = content.tag wenn name.startswith ('_'): name = '@' + name [1:] content.type = self.resolver.find (name, content.value) wenn content.type ist None: raise TypeNotFound (content.tag) ' – tandy

Antwort

1

Dieser Anruf ist:

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

vielleicht braucht es xsd:anyType[] zu arbeiten; i.o. Array von anyType anstatt anyType.

<message name="call"> 
    <part name="sessionId" type="xsd:string" /> 
    <part name="resourcePath" type="xsd:string" /> 
    <part name="args" type="xsd:anyType[]" /> 
</message> 
Verwandte Themen