2014-06-24 126 views
6

我在Python(2.7)中的应用程序应该使用客户端来使用WSDL(由Magento生成(1.7.0)生成并在末尾发布)中描述的SOAP Web服务。导入命名空间后的TypeNotFoundError

对于此任务泡沫(4.0)被选,当我试图与这些代码连接:

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

我接收到TypeNotFound误差由于这里描述https://fedorahosted.org/suds/wiki/Documentation#FIXINGBROKENSCHEMAs

然后一个众所周知的问题,我改变了我的代码:

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

不过,现在出现了一个新的异常:

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' 

我不明白,为什么它不能找到的“ARGS”的类型,如果是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> 

我的感觉是与命名空间中的名称有误,我已经尝试过这个线程具有相同的结果: SOAP suds and the dreaded schema Type Not Found error

+0

你可以编辑literal.py文件并添加一些打印语句来查看实际传递的信息吗? '如果content.type是无: 名称= content.tag 如果name.startswith( '_'): 名= '@' +名[1:] content.type = self.resolver.find(名称,content.value) if content.type为None: raise TypeNotFound(content.tag)' – tandy

回答

1

这是您的来电:

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

也许需要xsd:anyType[]才行; i.o.w.数组anyType而不是anyType

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