2009-09-30 19 views
1

J'essaye d'écrire un exemple de client en Python en utilisant ZSI pour un simple Web Service. Le WSDL de service Web suit:Client Web Service en Python utilisant ZSI - "Structure sans classe n'a pas obtenu de dictionnaire"

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/test/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="test" targetNamespace="http://www.example.org/test/"> 
    <wsdl:message name="NewOperationRequest"> 
    <wsdl:part name="NewOperationRequest" type="xsd:string"/> 
    </wsdl:message> 
    <wsdl:message name="NewOperationResponse"> 
    <wsdl:part name="NewOperationResponse" type="xsd:string"/> 
    </wsdl:message> 
    <wsdl:portType name="test"> 
    <wsdl:operation name="NewOperation"> 
     <wsdl:input message="tns:NewOperationRequest"/> 
     <wsdl:output message="tns:NewOperationResponse"/> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="testSOAP" type="tns:test"> 
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="NewOperation"> 
     <soap:operation soapAction="http://www.example.org/test/NewOperation"/> 
     <wsdl:input> 
     <soap:body namespace="http://www.example.org/test/" use="literal"/> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body namespace="http://www.example.org/test/" use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="test"> 
    <wsdl:port binding="tns:testSOAP" name="testSOAP"> 
     <soap:address location="http://localhost/test"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Chaque fois que je lance code suivant:

from ZSI.ServiceProxy import ServiceProxy 
service = ServiceProxy('test.wsdl') 
service.NewOperation('test') 

Je reçois:

(...) 
/var/lib/python-support/python2.5/ZSI/TCcompound.pyc in cb(self, elt, sw, pyobj, name, **kw) 
    345    f = lambda attr: pyobj.get(attr)           
    346    if TypeCode.typechecks and type(d) != types.DictType:     
--> 347     raise TypeError("Classless struct didn't get dictionary")   
    348                      
    349   indx, lenofwhat = 0, len(self.ofwhat)          

TypeError: Classless struct didn't get dictionary 

J'ai cherché Google pour cette erreur et j'ai trouvé les messages couple décrivant un problème similaire mais sans réponse. Savez-vous qu'il a tort ici? Y a-t-il une erreur dans le WSDL, est-ce que quelque chose me manque dans le code ou il y a un bug dans ZSI?

Merci à l'avance pour vous aider :-)

Répondre

3

Enfin, je l'ai trouvé la solution.

Je courrais comme ceci:

from ZSI.ServiceProxy import ServiceProxy 
service = ServiceProxy('test.wsdl') 
service.NewOperation(NewOperationRequest='test') 

La raison du problème était que le nom du paramètre était absent - erreur stupide ;-)

(sic!)