Cliente de serviço Web em Python utilizando ZSI - “Classless struct não conseguiu dicionário”

StackOverflow https://stackoverflow.com/questions/1496910

  •  19-09-2019
  •  | 
  •  

Pergunta

Eu estou tentando escrever um cliente de amostra em Python utilizando ZSI para um serviço Web simples. O serviço WSDL Web é o seguinte:

<?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 eu corro seguinte código:

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

Eu recebo:

(...)
/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

Eu tenho procurado Google para esse erro e eu achei mensagens casal descrevendo problema semelhante, mas sem resposta. Você sabe se está errado aqui? Existe um erro no WSDL, posso perder alguma coisa no código ou há um bug na ZSI?

Agradecemos antecipadamente para você ajuda: -)

Foi útil?

Solução

Finalmente, eu encontrei a solução.

eu deveria correr como este:

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

A razão do problema era que o nome do parâmetro estava faltando - erro bobo (sic!); -)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top