Servicio cliente Web en Python usando ZSI - “estructura sin clase no consiguió diccionario”
Pregunta
Estoy intentando escribir un cliente de ejemplo en Python usando ZSI para un simple servicio web. El WSDL de servicio Web es el siguiente:
<?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>
Cada vez que ejecute el código siguiente:
from ZSI.ServiceProxy import ServiceProxy
service = ServiceProxy('test.wsdl')
service.NewOperation('test')
Recibo:
(...)
/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
He buscado en Google de este error y me encontré con par de mensajes que describen un problema similar, pero que no tiene respuesta. ¿Sabe usted era está mal aquí? ¿Hay un error en el WSDL, hacer echo de menos algo en el código o hay un error en ZSI?
Gracias de antemano por su ayuda: -)
Solución
Por último, he encontrado la solución.
Debería funcionar de esta manera:
from ZSI.ServiceProxy import ServiceProxy
service = ServiceProxy('test.wsdl')
service.NewOperation(NewOperationRequest='test')
La razón de que el problema era que el nombre del parámetro que faltaba (sic!) - error tonto; -)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow