2008-10-28 13 views
19

मैं अजगर के लिए एक सोप ग्राहक के रूप में साबुन का झाग की जांच कर रहा हूँ करने के लिए प्रोग्रामेटिक एक्सेस। मैं तरीकों एक निर्दिष्ट सेवा से उपलब्ध है, और प्रकार एक निर्दिष्ट विधि के लिए आवश्यक का निरीक्षण करना चाहते हैं।साबुन का झाग - तरीकों और प्रकार

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

मैं एक विशेष विधि के बारे में कुछ जानकारी प्राप्त कर सकते हैं, लेकिन अनिश्चित यह कैसे पार्स करने के लिए कर रहा हूँ: मैं फोन करने के लिए सक्षम होने के लिए बनाने की जरूरत

client = Client(url) 
method = client.sd.service.methods['MyMethod'] 

मैं असमर्थ कर रहा हूँ programmaticaly आंकड़ा बाहर किस प्रकार आपत्ति सेवा

obj = client.factory.create('?') 

res = client.service.MyMethod(obj, soapheaders=authen) 

किसी को भी कुछ नमूना कोड है?

उत्तर

18

sudsdocumentation के अनुसार, आप __str()__ साथ service वस्तु निरीक्षण कर सकते हैं।

from suds.client import Client; 

url = 'http://www.webservicex.net/WeatherForecast.asmx?WSDL' 
client = Client(url) 

temp = str(client); 

कोड ऊपर परिणाम निम्न उत्पादन (temp की सामग्री):: तो निम्नलिखित तरीके और जटिल प्रकार की एक सूची हो जाता है

Suds (https://fedorahosted.org/suds/) version: 0.3.4 (beta) build: R418-20081208 

Service (WeatherForecast) tns="http://www.webservicex.net" 
    Prefixes (1) 
     ns0 = "http://www.webservicex.net" 
    Ports (2): 
     (WeatherForecastSoap) 
     Methods (2): 
      GetWeatherByPlaceName(xs:string PlaceName,) 
      GetWeatherByZipCode(xs:string ZipCode,) 
     Types (3): 
      ArrayOfWeatherData 
      WeatherData 
      WeatherForecasts 
     (WeatherForecastSoap12) 
     Methods (2): 
      GetWeatherByPlaceName(xs:string PlaceName,) 
      GetWeatherByZipCode(xs:string ZipCode,) 
     Types (3): 
      ArrayOfWeatherData 
      WeatherData 
      WeatherForecasts 

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

24

ठीक है, तो साबुन का झाग काफी जादू का एक सा है।

एक suds.client.Client, WSDL फ़ाइल से बनाया गया है:

client = suds.client.Client("http://mssoapinterop.org/asmx/simple.asmx?WSDL") 

यह डबल्यूएसडीएल डाउनलोड करता है और client.wsdl में एक परिभाषा पैदा करता है। जब आप client.service.<method> के माध्यम से एक विधि का उपयोग कर साबुन का झाग फोन यह वास्तव में है कि व्याख्या की डबल्यूएसडीएल के खिलाफ पर्दे के पीछे पुनरावर्ती संकल्प जादू की एक पूरी बहुत कुछ कर रहा है। विधियों के लिए पैरामीटर और प्रकारों को खोजने के लिए आपको इस ऑब्जेक्ट का आत्मनिरीक्षण करने की आवश्यकता होगी।

उदाहरण के लिए:

for method in client.wsdl.services[0].ports[0].methods.values(): 
    print '%s(%s)' % (method.name, ', '.join('%s: %s' % (part.type, part.name) for part in method.soap.input.body.parts)) 

इस तरह कुछ प्रिंट करना चाहिए:

echoInteger((u'int', http://www.w3.org/2001/XMLSchema): inputInteger) 
echoFloatArray((u'ArrayOfFloat', http://soapinterop.org/): inputFloatArray) 
echoVoid() 
echoDecimal((u'decimal', http://www.w3.org/2001/XMLSchema): inputDecimal) 
echoStructArray((u'ArrayOfSOAPStruct', http://soapinterop.org/xsd): inputStructArray) 
echoIntegerArray((u'ArrayOfInt', http://soapinterop.org/): inputIntegerArray) 
echoBase64((u'base64Binary', http://www.w3.org/2001/XMLSchema): inputBase64) 
echoHexBinary((u'hexBinary', http://www.w3.org/2001/XMLSchema): inputHexBinary) 
echoBoolean((u'boolean', http://www.w3.org/2001/XMLSchema): inputBoolean) 
echoStringArray((u'ArrayOfString', http://soapinterop.org/): inputStringArray) 
echoStruct((u'SOAPStruct', http://soapinterop.org/xsd): inputStruct) 
echoDate((u'dateTime', http://www.w3.org/2001/XMLSchema): inputDate) 
echoFloat((u'float', http://www.w3.org/2001/XMLSchema): inputFloat) 
echoString((u'string', http://www.w3.org/2001/XMLSchema): inputString) 

तो भाग के प्रकार टपल के पहले तत्व शायद है कि तुम क्या कर रहे हैं के बाद:

>>> client.factory.create(u'ArrayOfInt') 
(ArrayOfInt){ 
    _arrayType = "" 
    _offset = "" 
    _id = "" 
    _href = "" 
    _arrayType = "" 
} 

अद्यतन:

मौसम सेवा के लिए ऐसा लगता है कि "पैरामीटर" नहीं एक element एक type साथ एक हिस्सा हैं:

>>> client = suds.client.Client('http://www.webservicex.net/WeatherForecast.asmx?WSDL') 
>>> client.wsdl.services[0].ports[0].methods.values()[0].soap.input.body.parts[0].element 
(u'GetWeatherByZipCode', http://www.webservicex.net) 
>>> client.factory.create(u'GetWeatherByZipCode') 
(GetWeatherByZipCode){ 
    ZipCode = None 
} 

लेकिन इस विधि कॉल (एक ला client.service.GetWeatherByZipCode("12345") के मापदंडों में magic'd है। आईआईआरसी यह एसओएपी आरपीसी बाध्यकारी शैली है? मुझे लगता है कि आपको शुरू करने के लिए यहां पर्याप्त जानकारी है। संकेत: पायथन कमांड लाइन इंटरफ़ेस आपका मित्र है!

+1

का डिफ़ॉल्ट रूप किसी कारण से, इन सभी wsdl मैं के साथ काम कर रहा हूँ के साथ "कोई नहीं" हैं, तो मैं, पैरामीटर या प्रकार मिलता है फिर भी नहीं है , वे str (क्लाइंट) में दिखाई देते हैं और दोनों पैरामीटर और टाइप करते हैं। – Wyrmwood

8

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

import suds 

def list_all(url): 
    client = suds.client.Client(url) 
    for service in client.wsdl.services: 
     for port in service.ports: 
      methods = port.methods.values() 
      for method in methods: 
       print(method.name) 
       for part in method.soap.input.body.parts: 
        part_type = part.type 
        if(not part_type): 
         part_type = part.element[0] 
        print(' ' + str(part.name) + ': ' + str(part_type)) 
        o = client.factory.create(part_type) 
        print(' ' + str(o)) 
+0

धन्यवाद! मेरे लिए भी काम करता है :) –

3

आप सूड की सेवा परिभाषा ऑब्जेक्ट तक पहुंच सकते हैं। यहां एक त्वरित नमूना है:

from suds.client import Client 
c = Client('http://some/wsdl/link') 

types = c.sd[0].types 

अब, अगर आप एक प्रकार का उपसर्ग के नाम जानना चाहते हैं, यह भी काफी आसान है:

c.sd[0].xlate(c.sd[0].types[0][0]) 

इस दोहरे ब्रैकेट अंकन है क्योंकि प्रकार एक सूची है (इसलिए पहला [0]) और फिर इस सूची में प्रत्येक आइटम में दो आइटम हो सकते हैं। हालांकि, झाग के __unicode__ की आंतरिक कार्यान्वयन वास्तव में है कि (यानी सूची पर ही पहला आइटम लेता है):

s.append('Types (%d):' % len(self.types)) 
    for t in self.types: 
     s.append(indent(4)) 
     s.append(self.xlate(t[0])) 

मुबारक कोडिंग;)

0

एक बार जब आप डबल्यूएसडीएल विधि वस्तु बनाया आप से इसके बारे में जानकारी प्राप्त कर सकते हैं यह __metadata__ है, जिसमें इसके तर्कों के नाम शामिल हैं।

तर्क के नाम को देखते हुए, आप बनाई गई विधि में इसका वास्तविक उदाहरण एक्सेस कर सकते हैं। यही कारण है कि उदाहरण भी यह __metadata__ में जानकारी दी गई है शामिल है, वहाँ आप इसे नाम टाइप करें

# creating method object 
method = client.factory.create('YourMethod') 
# getting list of arguments' names 
arg_names = method.__metadata__.ordering 
# getting types of those arguments 
types = [method.__getitem__(arg).__metadata__.sxtype.name for arg in arg_names] 

अस्वीकरण है प्राप्त कर सकते हैं: जटिल डबल्यूएसडीएल प्रकार के साथ यह केवल काम करता है। तार और नंबर की तरह सरल प्रकार, कोई भी

0
from suds.client import Client 
url = 'http://localhost:1234/sami/2009/08/reporting?wsdl' 
client = Client(url) 
functions = [m for m in client.wsdl.services[0].ports[0].methods] 
count = 0 
for function_name in functions: 
    print (function_name) 
    count+=1 
print ("\nNumber of services exposed : " ,count) 
संबंधित मुद्दे