2014-06-24 60 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>