डिफ़ॉल्ट रूप से, SOAPpy विधि 0 का उपयोग HTTP SOAPAction
शीर्षलेख के मान के रूप में करता है। आप निम्न कोड चलाते हैं तो आप डिबग आउटपुट में मूल्य देखेंगे:
from SOAPpy import SOAPProxy
from datetime import datetime
input = datetime.now()
namespace = "http://web.cbr.ru/"
url = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx"
proxy = SOAPProxy(url, namespace)
proxy.config.debug = 1
proxy.GetCursOnDate(input)
इस बग को पता चलता है:
*** Outgoing HTTP headers ***************************
POST /DailyInfoWebServ/DailyInfo.asmx HTTP/1.0
Host: www.cbr.ru
User-agent: SOAPpy 0.12.5 (http://pywebsvcs.sf.net)
Content-type: text/xml; charset=UTF-8
Content-length: 406
SOAPAction: "GetCursOnDate"
*****************************************************
लेकिन सेवा एक और मूल्य (http://web.cbr.ru/GetCursOnDate
) आप पर सेट कर सकते हैं उम्मीद एक अतिरिक्त पैरामीटर के साथ प्रॉक्सी। निम्नलिखित कोड त्रुटि को साफ करता है:
from SOAPpy import SOAPProxy
from datetime import datetime
input = datetime.now()
namespace = "http://web.cbr.ru/"
url = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx"
soapaction = "http://web.cbr.ru/GetCursOnDate"
proxy = SOAPProxy(url, namespace = namespace, soapaction = soapaction)
proxy.config.debug = 1
proxy.GetCursOnDate(input)
डिबग अब यह दिखाएगा:
*** Outgoing HTTP headers ***************************
POST /DailyInfoWebServ/DailyInfo.asmx HTTP/1.0
Host: www.cbr.ru
User-agent: SOAPpy 0.12.5 (http://pywebsvcs.sf.net)
Content-type: text/xml; charset=UTF-8
Content-length: 406
SOAPAction: "http://web.cbr.ru/GetCursOnDate"
*****************************************************
लेकिन हालांकि कि विशिष्ट गलती चला गया है, कॉल काम नहीं करेगा। क्योंकि आप प्रश्नों के साथ वापस आ जाएंगे, मैंने सोचा था कि मैं हमें कुछ संदेश एक्सचेंजों को छोड़ दूंगा और सीधे अनुक्रम लिखूंगा। मैंने पाइथन के एसओएपी समर्थन on another occasion के साथ मेरी निराशा का उल्लेख किया। इस पोस्ट के लिए मैं अपने विवरण के संदर्भ में और अन्य उपयोगकर्ताओं के लिए आशा के रूप में यहां सभी विवरण जोड़ रहा हूं। तो यहां यह जाता है ...
कॉल काम नहीं करेगा क्योंकि डिफ़ॉल्ट रूप से SOAPpy कॉल के लिए आदेश पैरामीटर का उपयोग करता है। उन्हें v1
, v2
, v3
आदि कहा जाता है (अधिक जानकारी के लिए SOAPpy डाउनलोड के अंदर MethodParameterNaming.txt
फ़ाइल देखें)। आपका सोप संदेश इस तरह दिखेगा:
<SOAP-ENV:Body>
<ns1:GetCursOnDate xmlns:ns1="http://web.cbr.ru/" SOAP-ENC:root="1">
<v1>
</v1>
</ns1:GetCursOnDate>
</SOAP-ENV:Body>
यह विशेष रूप से वेब सेवा On_date
, नहीं v1
नाम के एक पैरामीटर उम्मीद कर रही है। आप नाम वाले पैरामीटर का उपयोग करके इसे ठीक करने की कोशिश कर सकते हैं:
from SOAPpy import SOAPProxy
from datetime import datetime
input = datetime.now()
namespace = "http://web.cbr.ru/"
url = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx"
soapaction = "http://web.cbr.ru/GetCursOnDate"
proxy = SOAPProxy(url, namespace = namespace, soapaction = soapaction)
proxy.config.debug = 1
proxy.GetCursOnDate(On_date = input)
आपका संदेश अब इस तरह दिखता है:
<SOAP-ENV:Body>
<ns1:GetCursOnDate xmlns:ns1="http://web.cbr.ru/" SOAP-ENC:root="1">
<On_date>
</On_date>
</ns1:GetCursOnDate>
</SOAP-ENV:Body>
मुझे लगता है कि क्योंकि प्रॉक्सी datetime
वस्तुओं के साथ एक मुद्दा है की तारीख से मान अनुपलब्ध है । मैंने वास्तव में यह देखने के लिए जांच नहीं की कि समस्या क्या है क्योंकि इस संदेश के साथ एक और समस्या है: वेब सेवा <ns1:On_date>
<On_date>
की अपेक्षा करती है।
यह वह जगह है जहां SOAPpy नामस्थानों के साथ कुछ समस्याएं हैं। मूल SOAPpy स्रोत कोड का उपयोग करके आप नामस्थान बदल नहीं सकते हैं। ऐसा लगता है कि अधिकांश पायथन के एसओएपी पुस्तकालयों के साथ आप कोड को ट्वीव करके केवल वांछित व्यवहार प्राप्त कर सकते हैं, जो मैंने किया था। मैंने कुछ स्थानों पर SOAPBuilder.py
फ़ाइल को बदल दिया जहां नामस्थान और टैग उपसर्गों को संभाला गया था।मूल फ़ाइल here और बदले गए here देखें।
परिणाम मैं खोज रहा था
from SOAPpy import SOAPProxy
from SOAPpy import Types
namespace = "http://web.cbr.ru/"
url = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx"
soapaction = "http://web.cbr.ru/GetCursOnDate"
input = Types.dateType(name = (namespace, "On_date"))
proxy = SOAPProxy(url, namespace = namespace, soapaction = soapaction)
proxy.config.debug = 1
proxy.GetCursOnDate(input)
अब मैं हो:
<SOAP-ENV:Body>
<ns1:GetCursOnDate xmlns:ns1="http://web.cbr.ru/" SOAP-ENC:root="1">
<ns1:On_date xsi:type="xsd:date">2013-11-02Z</ns1:On_date>
</ns1:GetCursOnDate>
</SOAP-ENV:Body>
सर्वर की ओर
ये वे परिवर्तन मुझे संदेश पर एक बेहतर नियंत्रण के लिए एक SOAPpy प्रकार उपयोग करने की अनुमति उपर्युक्त अनुरोध पर डेटा।
लेकिन ऊपर दिए गए कोड को भी बेहतर किया जा सकता है। ध्यान दें कि मैं एक विशेष ऑपरेशन के लिए प्रॉक्सी पर SOAPAction
सेट कर रहा हूं: GetCursOnDate
। अगर मैं इसे किसी अन्य ऑपरेशन के साथ उपयोग करना चाहता हूं तो मुझे एक और प्रॉक्सी चाहिए या मुझे इसे संशोधित करने की आवश्यकता है। WSDL.Proxy
का उपयोग करके आप इसे स्वचालित रूप से डब्लूएसडीएल से प्राप्त करते हैं (यह SOAPProxy
रैपर प्रदान करता है जो वेब सेवा के डब्ल्यूएसडीएल से विधि नाम, नामस्थान और SOAPAction
एस पार्स करता है)।
लेकिन अगर यह स्वचालित रूप से SOAPAction
को संभालता है तो यह विधि के लिए नामस्थान नहीं लेता है। तो मैंने WSDL.py
फ़ाइल tweaked। मूल संस्करण here है, परिवर्तित फ़ाइल here है। नए ग्राहक कोड अब इस तरह दिखता है:
from SOAPpy import WSDL
from SOAPpy import Types
# you can download this and use it locally for better performance
wsdl = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?wsdl"
namespace = "http://web.cbr.ru/"
input = Types.dateType(name = (namespace, "On_date"))
proxy = WSDL.Proxy(wsdl, namespace = namespace)
proxy.soapproxy.config.debug = 1
proxy.GetCursOnDate(input)
ऊपर दिए गए उदाहरणों मैं पायथन 2.6.6, SOAPpy 0.12.5, इस्तेमाल किया 0.7.2 fpconst और 0.4.3 wstools लिए। दूसरों के लिए मैं उन संस्करणों या विशेष वेब सेवा के आधार पर वाईएमएमवी सोचता हूं जिन्हें आप बुला रहे हैं। अंत में मैं यह भी उल्लेख करना चाहता हूं कि यदि आप Google पर कोई खोज करते हैं तो आपको पता चलेगा कि अधिकांश लोग SOAPpy के बजाय एसओएपी क्लाइंट के रूप में एसयूडीएस की सलाह देते हैं, तो शायद उस पर भी एक नज़र डालें। सौभाग्य!