2013-10-31 8 views
6

मैं पाइथन 2.7 पर SOAPpy का उपयोग करके एक SOAP अनुरोध का उपयोग करके एक विधि को कॉल करने का प्रयास कर रहा हूं। विधि को GetCursOnDate कहा जाता है और विनिमय दर देता है। यह एक दिनांक पैरामीटर लेता है।SOAPpy का उपयोग करके SOAP अनुरोध कैसे करें?

मैं निम्नलिखित कोड का उपयोग कर रहा:

from SOAPpy import SOAPProxy 
import datetime 

date=datetime.datetime.now() 
namespace ="http://web.cbr.ru/" 
url = "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx" 
server = SOAPProxy(url,namespace) 
print (date) 
server.GetCursOnDate(date) 

लेकिन मैं वापस कोई त्रुटि मिलती है: क्यों मैं इस त्रुटि मिलती है

Fault soap:Client: Server did not recognize the value of HTTP Header SOAPAction: GetCursOnDate.

?

उत्तर

12

डिफ़ॉल्ट रूप से, 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 के बजाय एसओएपी क्लाइंट के रूप में एसयूडीएस की सलाह देते हैं, तो शायद उस पर भी एक नज़र डालें। सौभाग्य!

0

ऐसा लगता है कि लक्ष्य नामस्थान को अनदेखा किया गया है लेकिन आप ऑपरेशन प्रति नाम सेट कर सकते हैं जो इतनी अच्छी तरह से काम करता है।

<operation name="createCall"> 
<soap:operation soapAction=""/> 
    <input> 
     <soap:body use="literal" namespace="http://create.service/"/> 
    </input> 
    <output> 
     <soap:body use="literal" namespace="http://create.service/"/> 
    </output> 
</operation> 

निश्चित रूप से आप के बजाय अपने नाम स्थान का उपयोग करना चाहिए http://create.service/

संबंधित मुद्दे