عميل خدمة الويب في Python باستخدام ZSI - "Instless Form لم يحصل قاموس"

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

  •  19-09-2019
  •  | 
  •  

سؤال

أحاول كتابة عميل عينة في Python باستخدام ZSI للحصول على خدمة ويب بسيطة. خدمة الويب WSDL التالية:

<?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>

في كل مرة أقوم بتشغيل التعليمات البرمجية التالية:

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

انا اتلقى:

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

لقد بحثت Google لهذا الخطأ ووجدت وظائف زوجين تصف مشكلة مماثلة ولكن دون إجابة. هل تعرف هل كان خطأ هنا؟ هل هناك خطأ في WSDL، هل افتقد شيئا في الرمز أو هناك خطأ في ZSI؟

شكرا لكم مقدما على مساعدتكم :-)

هل كانت مفيدة؟

المحلول

أخيرا، وجدت الحل.

يجب أن أركض مثل هذا:

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

كان سبب المشكلة هو أن اسم المعلمة مفقودا (SIC!) - خطأ سخيف ؛-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top