عميل خدمة الويب في Python باستخدام ZSI - "Instless Form لم يحصل قاموس"
سؤال
أحاول كتابة عميل عينة في 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!) - خطأ سخيف ؛-)
لا تنتمي إلى StackOverflow