मैं पायथन में एक WSDL (SOAP) वेब सेवा का उपभोग कैसे कर सकता हूं?


124

मैं Python में एक WSDL SOAP आधारित वेब सेवा का उपयोग करना चाहता हूं। मैंने पाइवट कोड में डाइव को देखा है, लेकिन पायथन मॉड्यूल 2.5 पायथन के तहत काम नहीं करता है।

मैंने ऐसे साड्स का उपयोग करने की कोशिश की है जो आंशिक रूप से काम करता है, लेकिन कुछ प्रकारों (suds.TypeNotFound: Type not found: 'item') के साथ टूट जाता है।

मैंने क्लाइंट को भी देखा है लेकिन यह WSDL का समर्थन नहीं करता है।

और मैंने ZSI को देखा है लेकिन यह बहुत जटिल है। क्या किसी के पास इसके लिए कोई नमूना कोड है?

WSDL https://ws.pPN.com/soap/PPNAPI.wsdl है और PHP 5 SOAP क्लाइंट के साथ ठीक काम करता है।


3
क्या आप अपने स्वीकृत उत्तर को बदलने पर विचार करेंगे? वर्तमान में स्वीकृत उत्तर -1 है, और +19 के साथ एक और उत्तर है। मुझे पता है कि यह 2008 से है; मैं सिर्फ सुझाव दे रहा हूं।
मार्क ई। हासे

SUDS काम नहीं करता था क्योंकि यह WSDL को ठीक से पार्स नहीं कर सकता था, लेकिन अन्यथा एक अच्छा विकल्प होता। इसलिए मैंने डायव इन पाइथन के एक ट्यूटोरियल के उत्तर को बदल दिया जिसमें कुछ विकल्प हैं। एक तरफ ध्यान दें के रूप में, Pingdom अब एक REST API का है pingdom.com/services/api-documentation-rest पर ग्राहक पुस्तकालयों के साथ blog.pingdom.com/2011/04/11/pingdom-rest-api-wrappers
davidmytton

जवाबों:


49

मैं आपको सलाह दूंगा कि आपकी नज़र SUDS पर है

"सूद वेब सेवाओं के उपभोग के लिए एक हल्का SOAP अजगर ग्राहक है।"


Seconded। किसी भी वर्ग की पीढ़ी, मेरे पास तत्काल समझ में आ गई, यह WSDL को लाइव लोड करता है और एक ऐसी वस्तु बनाता है जिसका आप तुरंत उपयोग कर सकते हैं।
EnigmaCurry

19
WSDL को पुनरावर्ती आयातों के साथ खोलते समय सूद की एक अनंत पुनरावृत्ति समस्या होती है। यह सूड्स द्वारा एक अवरुद्ध बग माना जाता है, और इस मुद्दे को 3 साल पहले बनाया गया था, लेकिन यह अभी तक तय नहीं किया गया है। fedorahosted.org/suds/ticket/239 यह मुझे आश्चर्य होता है कि क्या सूद 2012 में उपयोग के लिए उपयुक्त है?
बटंस Feb४०

2
सूद मरा हुआ लगता है। लंबे समय तक लाइव SUDS - यह सक्रिय कांटा लगता है।
nerdoc

3
यह शीर्ष उत्तर है, लेकिन अगर किसी के लिए भी एक उत्तर की तलाश है जो आज काम करता है, तो जीप पर विचार करें , जैसा कि नए उत्तर भी सुझाते हैं।
तोबियास फील

25

एक अपेक्षाकृत नया पुस्तकालय है जो बहुत आशाजनक है और यद्यपि अभी भी खराब दस्तावेज है, बहुत साफ और अजगर लगता है: अजगर की जीप

एक उदाहरण के लिए इस उत्तर को भी देखें ।


2
इसके लिए +1। मैंने आज जीप की कोशिश की और इसका उपयोग करना आश्चर्यजनक रूप से आसान था। कोड की 3 लाइनों के साथ एक साबुन 1.1 / 1.2 सेवा का उपभोग और कॉल करने में सक्षम था।
जगु

20

मैं हाल ही में एक ही समस्या पर ठोकर खाई। यहाँ मेरे समाधान का सारांश है:

बुनियादी घटक कोड ब्लॉक की जरूरत है

आपके क्लाइंट एप्लिकेशन के आवश्यक बुनियादी कोड ब्लॉक निम्नलिखित हैं

  1. सत्र अनुरोध अनुभाग: प्रदाता के साथ एक सत्र का अनुरोध करें
  2. प्रमाणीकरण प्रमाणीकरण अनुभाग: प्रदाता को क्रेडेंशियल्स प्रदान करते हैं
  3. क्लाइंट सेक्शन: क्लाइंट बनाएं
  4. सुरक्षा हैडर अनुभाग: क्लाइंट के लिए WS-Security Header जोड़ें
  5. उपभोग अनुभाग: आवश्यकतानुसार उपलब्ध संचालन (या विधियों) का उपभोग करें

आपको किन मॉड्यूल्स की आवश्यकता है?

कई ने सुझाव दिया कि पायथन मॉड्यूल का उपयोग करें जैसे कि urllib2; हालाँकि, कोई भी मॉड्यूल इस विशेष परियोजना के लिए कम से कम काम नहीं करता है।

तो, यहां उन मॉड्यूल की सूची दी गई है जिन्हें आपको प्राप्त करने की आवश्यकता है। सबसे पहले, आपको निम्नलिखित लिंक से सूद के नवीनतम संस्करण को डाउनलोड और इंस्टॉल करना होगा:

pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2

इसके अतिरिक्त, आपको निम्न लिंक से क्रमशः अनुरोधों और suds_requests मॉड्यूल को डाउनलोड और इंस्टॉल करना होगा (अस्वीकरण: मैं यहां पोस्ट करने के लिए नया हूं, इसलिए मैं अभी के लिए एक से अधिक लिंक पोस्ट नहीं कर सकता)।

pypi.python.org/pypi/requests

pypi.python.org/pypi/suds_requests/0.1

एक बार जब आप सफलतापूर्वक इन मॉड्यूल को डाउनलोड और इंस्टॉल कर लेते हैं, तो आप जाने के लिए अच्छे हैं।

कोड

पहले बताए गए चरणों का पालन करते हुए, कोड निम्न की तरह दिखता है: आयात:

import logging
from suds.client import Client
from suds.wsse import *
from datetime import timedelta,date,datetime,tzinfo
import requests
from requests.auth import HTTPBasicAuth
import suds_requests

सत्र अनुरोध और प्रमाणीकरण:

username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)

क्लाइंट बनाएँ:

client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))

WS-Security Header जोड़ें:

...
addSecurityHeader(client,username,password)
....

def addSecurityHeader(client,username,password):
    security=Security()
    userNameToken=UsernameToken(username,password)
    timeStampToken=Timestamp(validity=600)
    security.tokens.append(userNameToken)
    security.tokens.append(timeStampToken)
    client.set_options(wsse=security)

कृपया ध्यान दें कि यह विधि Fig.1 में दर्शाया गया सुरक्षा शीर्ष लेख बनाता है। इसलिए, आपका कार्यान्वयन आपके द्वारा उपभोग की जा रही सेवा के स्वामी द्वारा प्रदान किए गए सही सुरक्षा हेडर प्रारूप के आधार पर भिन्न हो सकता है।

प्रासंगिक विधि (या संचालन) का उपभोग करें:

result=client.service.methodName(Inputs)

लॉगिंग :

इस तरह के कार्यान्वयन में सर्वोत्तम प्रथाओं में से एक यह है कि संचार को कैसे निष्पादित किया जाता है यह देखने के लिए लॉगिंग है। यदि कोई समस्या है, तो यह डीबग करना आसान बनाता है। निम्न कोड बेसिक लॉगिंग करता है। हालांकि, आप कोड में दर्शाए गए लोगों के अलावा संचार के कई पहलुओं को लॉग कर सकते हैं।

logging.basicConfig(level=logging.INFO) 
logging.getLogger('suds.client').setLevel(logging.DEBUG) 
logging.getLogger('suds.transport').setLevel(logging.DEBUG)

परिणाम:

यहाँ मेरे मामले में परिणाम है। ध्यान दें कि सर्वर HTTP 200 लौटा है। यह HTTP अनुरोध-प्रतिक्रिया के लिए मानक सफलता कोड है।

(200, (collectionNodeLmp){
   timestamp = 2014-12-03 00:00:00-05:00
   nodeLmp[] = 
      (nodeLmp){
         pnodeId = 35010357
         name = "YADKIN"
         mccValue = -0.19
         mlcValue = -0.13
         price = 36.46
         type = "500 KV"
         timestamp = 2014-12-03 01:00:00-05:00
         errorCodeId = 0
      },
      (nodeLmp){
         pnodeId = 33138769
         name = "ZION 1"
         mccValue = -0.18
         mlcValue = -1.86
         price = 34.75
         type = "Aggregate"
         timestamp = 2014-12-03 01:00:00-05:00
         errorCodeId = 0
      },
 })

1
यह कहने के लायक हो सकता है कि suds_requestस्थापित करते समय विफल हो जाएगा, इसलिए यदि आप suds-jurkoकांटा का उपयोग कर रहे हैं , तो आप इंस्टॉल कर सकते हैं suds_requestजो जर्को के सूद के संस्करण के साथ काम करने के लिए अनुकूलित किया गया था:pip install git+https://github.com/chrcoe/suds_requests.git@feature/python3_suds_jurko
इरेटा

7

अभी (2008 के अनुसार), पायथन चूसना के लिए उपलब्ध सभी सोप लाइब्रेरी। यदि संभव हो तो मैं SOAP से बचने की सलाह देता हूं। पिछली बार जब हमने पायथन से SOAP वेब सेवा का उपयोग करने के लिए मजबूर किया था, हमने C # में एक आवरण लिखा था, जो एक तरफ SOAP को संभाला और दूसरे को COM बोला।


15
यह xml और http पर आधारित एक साधारण प्रोटोकॉल का उपयोग करने के लिए एक पागल जटिल तरीके की तरह लगता है।
दिन

1
2008 में, यह वह तरीका था जिसने हमारी जरूरतों के लिए कम से कम चूसा। मुझे याद है कि उस विशेष वेब सेवा के बारे में बहुत कुछ समझ में आया था कि सभी अजगर पुस्तकालय गलत हो रहे थे।
मैथ्यू स्काउटन

1
2019, अजगर जीप, सूद, अभी भी कई पार्सिंग असंगतता के लिए प्रवण हैं। पूरी तरह से wsdl दस्तावेज़ों को बनाए रखने से उन मॉड्यूलों को गैर-स्टॉप पटाखे की तरह फेंक दिया जाएगा।
मूटमूट


6

मैं समय-समय पर इसका संतोषजनक उत्तर खोजता हूं, लेकिन अब तक कोई भाग्य नहीं। मैं साबुन + अनुरोध + मैनुअल श्रम का उपयोग करता हूं।

मैंने आखिरी बार जावा को दिया था और मुझे ऐसा करने की आवश्यकता थी , और बस आखिरी बार कुछ समय के लिए मैंने ऐसा करना चाहा , लेकिन यह आवश्यक नहीं था।

पिछले साल प्रोजेक्ट प्लेस के रेस्टफुल एपीआई के साथ अनुरोध लाइब्रेरी का सफलतापूर्वक उपयोग करने के बाद, यह मेरे लिए हुआ कि शायद मैं SOAP अनुरोधों को हाथ से रोल कर सकता हूं जो मैं इसी तरह से भेजना चाहता हूं।

भी मुश्किल नहीं है कि पता चला है, लेकिन यह है , खासकर अगर क्षेत्रों असंगत नाम हैं (एक मैं वर्तमान में आज पर काम कर रहा हूँ 'jobId', JobId 'और' JobID 'है समय लेने वाली और त्रुटि होने का खतरा,। मैं लोड करने के लिए soapUI का उपयोग डब्लूएसडीएल को एंडपॉइंट्स निकालने आदि के लिए आसान बनाने और कुछ मैनुअल परीक्षण करने के लिए। अब तक मैं भाग्यशाली रहा हूं कि किसी भी डब्लूएसडीएल जो मैं उपयोग कर रहा हूं, उन परिवर्तनों से प्रभावित नहीं हुआ।


3

यह सच नहीं है SOAPpy पायथन 2.5 के साथ काम नहीं करता है - यह काम करता है, हालांकि यह बहुत सरल है और वास्तव में, वास्तव में बुनियादी है। यदि आप किसी भी अधिक जटिल वेबसर्विस से बात करना चाहते हैं, तो ZSI आपका एकमात्र दोस्त है।

वास्तव में उपयोगी डेमो मुझे http://www.ebi.ac.uk/Tools/webservices/tutorials/python पर मिला है - इससे मुझे यह समझने में मदद मिली कि ZSI कैसे काम करता है।


1
python setup.py स्थापित नवीनतम रिलीज के साथ त्रुटियों देता है। नवीनतम देव प्रति काम हो सकता है लेकिन ऐसा करने के लिए एक दर्द है।
davidmytton


1

SOAPpy अब अप्रचलित है, AFAIK, ZSL द्वारा प्रतिस्थापित। यह एक म्यूट पॉइंट है, क्योंकि मैं या तो एक काम करने के लिए नहीं मिल सकता है, बहुत कम संकलन, या तो पायथन 2.5 या पायथन 2.6 पर


1
#!/usr/bin/python
# -*- coding: utf-8 -*-
# consume_wsdl_soap_ws_pss.py
import logging.config
from pysimplesoap.client import SoapClient

logging.config.dictConfig({
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(name)s: %(message)s'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'pysimplesoap.helpers': {
            'level': 'DEBUG',
            'propagate': True,
            'handlers': ['console'],
        },
    }
})

WSDL_URL = 'http://www.webservicex.net/stockquote.asmx?WSDL'
client = SoapClient(wsdl=WSDL_URL, ns="web", trace=True)
client['AuthHeaderElement'] = {'username': 'someone', 'password': 'nottelling'}

#Discover operations
list_of_services = [service for service in client.services]
print(list_of_services)

#Discover params
method = client.services['StockQuote']

response = client.GetQuote(symbol='GOOG')
print('GetQuote: {}'.format(response['GetQuoteResult']))

यह लिबास यहां सूचीबद्ध है: code.google.com/archive/p/pysimplesoap
डाउन स्ट्रीम

नमूना आउटपुट: ... DEBUG: pysimplesoap.helpers: complexContent / simpleType / element string = string [u'StockQuote '] GetQuote: <StockQuotes> <Stock> <Symbol> GOOG </ Symbol> <Last> 816.13 </ last> <दिनांक> 2017/03/23 </ दिनांक> <समय> 11:41 बजे </ समय> <बदलें> -13.46 </ बदलें> <खोलें> 820.01 </ ओपन> <उच्च> 822.57 </ उच्च> <कम> 812.26 </ low> <वॉल्यूम> 1973140 </ वॉल्यूम> <MktCap> 564.29B </ MktCap> <पिछलाक्लिक करें> 829.59 </ पिछलाक्लिक करें> <प्रतिशतता>> -1.62% </ PercentageChange> <AnnRange> 663.28 - 853.50% <Earns> 27.88 </ Earns> <PE> 29.28 </ PE> <नाम> वर्णमाला इंक। </ Name> </ Stock> </ StockQuotes>
डाउन स्ट्रीम

pysimplesoap / client.py में Python3 पर विफल: 757 - 'तानाशाह' वस्तु की कोई विशेषता नहीं 'पुनरावृत्तियों'
ierdna

जाहिरा तौर पर संस्करण जो PIP के साथ आता है वह टूट गया है। इसे GIT से मैन्युअल रूप से स्थापित करना है - यह चीजों को ठीक करता है
ierdna

अच्छी बात: इस लिंक को देखें: stackoverflow.com/questions/13998492/iteritems-in-python "dict.iteritems को हटा दिया गया क्योंकि तानाशाही है। अब बात तानाशाही की करता है। piton 2 में चिड़ियों ने किया था ..."
डाउन द स्ट्रीम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.