2009-12-17 21 views
11

तो मैं वेब सेवाओं के लिए थोड़ा नया हूं और हाल ही में एक स्थिति आई है जहां हमने डेटा-प्रकार में एक तत्व जोड़ा जो ग्राहक को वापस लौटा दिया जाता है। ग्राहकों ने शिकायत की कि इसने अपने कार्यान्वयन को तोड़ दिया क्योंकि यह उस नए तत्व पर पड़ा जिसकी अपेक्षा नहीं थी। (हम एक्सिस 2 के माध्यम से सेवाएं प्रदान कर रहे हैं)।पिछड़ा संगतता और वेब सेवाएं

मेरे लिए यह एक हानिकारक परिवर्तन की तरह लगता है कि ग्राहक को गहन तरीके से संभालने में सक्षम होना चाहिए (मैंने कुछ गैर-वेब-सेवा ढांचे के साथ काम किया है जहां वैकल्पिक जानकारी को पूरी तरह स्वीकार्य था)। मैं समझ सकता हूं कि क्या हमने कुछ फ़ील्ड हटा दिए हैं या उनका नाम बदल दिया है जो क्लाइंट के लिए समस्याएं पैदा करेंगे।

मूल रूप से मैं wsdl को एक इंटरफ़ेस की तरह कार्य करने की अपेक्षा करता हूं। यदि हम एक ऐसा परिवर्तन करते हैं जो अनिवार्य रूप से उस इंटरफ़ेस को उपप्रकार करता है, तो मैं उम्मीद करता हूं कि क्लाइंट बाहरी तत्वों को खुशी से अनदेखा कर देगा। क्या यह सिर्फ वेब सेवाओं का एक छोटा सा आ रहा है, या क्या सेवाओं में निष्क्रिय परिवर्तन करने का एक सौहार्दपूर्ण तरीका है ताकि नए ग्राहक अतिरिक्त डेटा प्राप्त कर सकें जबकि पुराने ग्राहक अपने अवकाश पर अपडेट कर सकें?

+0

मैं सुझाव दूंगा कि यह संभव है कि क्लाइंट इसे खराब कर रहा है और एसओएपी इंटरफेस का उपयोग नहीं कर रहा है और शायद कुछ भयानक मैनुअल पार्सिंग/नियमित अभिव्यक्ति फज द्वारा प्रतिक्रिया को पार्स कर रहा है (यह आश्चर्यजनक है कि कितने लोग ऐसा करते हैं)। मैं यह कहता हूं क्योंकि मैं नियमित रूप से यूनिक्स और विंडोज सिस्टम (वेब ​​ऐप्स, सर्वर पक्ष और डेस्कटॉप क्लाइंट ऐप्स में) पर सी #, पीएचपी, पर्ल और जावास्क्रिप्ट में बिल्ड क्लाइंट और सर्वर एसओएपी इंटरफेस बनाते हैं और कभी भी इस समस्या में नहीं चलते हैं (वैकल्पिक फ़ील्ड जोड़ना अनुरोध या प्रतिक्रिया में कभी एक समस्या नहीं हुई है)। मैं उनसे पूछूंगा कि वे क्या एसएएपी क्लाइंट का उपयोग कर रहे हैं। :-) –

उत्तर

9

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

डब्ल्यूएसडीएल जितना अधिक विशिष्ट होगा उतना अधिक व्यवहार है जितना आप "गारंटी" कर रहे हैं।

आप अपने दिए गए डेटा में लचीलेपन की जरूरत है (यानी जोड़ने/क्षेत्रों आदि को हटाने) आप निम्न में से एक कर सकते हैं:

  1. संस्करण अपने डबल्यूएसडीएल परिभाषा और सेवाओं है कि नए संस्करण
  2. के पुराने संस्करणों अनुप्रेषित कर सकते हैं प्रकाशित
  3. जटिलता को छिपाने या डेटा बदलने के लिए एक्सएमएल जैसे अधिक अमूर्त डेटा रिटर्न प्रकारों का उपयोग करें।

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

4

अतीत में, जब खुला वेब सेवा API से निपटने के दौरान, मैं हमेशा दिनांक-संस्करण दर्शन के साथ चला गया हूं। दुर्भाग्यवश, जब आप "बीटा" मोड (और कभी-कभी तब भी) से बाहर हो जाते हैं, तो आपको किसी भी एपीआई के लिए पिछली संगतता से निपटना होगा।

हमने जो किया वह वास्तव में सरल था; दिन नए एपीआई जारी किया गया था, हम तो जैसे एक फ़ोल्डर संरचना बना सकते हैं: इस तरह हम पता होगा जो संस्करण था

http://mydomain.com/path/to/service/2009/12/17/servicename.svc 

नवीनतम सिर्फ फ़ोल्डर संरचना की जाँच, और हमारे ग्राहकों नहीं होगा द्वारा बदलावों को तोड़ने के बारे में चिंता करने के लिए जब तक वे अपग्रेड करने के लिए तैयार नहीं थे। हमारे लिए एक चैंप की तरह काम किया;

http://mydomain.com/path/to/service/2009-12-17/servicename.svc 
+0

मैं कुछ ऐसा ही करता हूं, सिवाय इसके कि मैं स्पष्ट संस्करण संख्याओं का उपयोग करना पसंद करता हूं (उदाहरण के लिए http: // http: //example.com/ServiceName/1.0/Service/) और केवल एपीआई में बदलते ही इसे बंप करें एक गैर पीछे संगत तरीका। –

3

एक डब्लूएसडीएल प्रभावी रूप से आपकी वेब सेवा का प्रकाशित एसओएपी इंटरफ़ेस है। कई ग्राहक इसका उपयोग अपने क्लाइंट प्रॉक्सी उत्पन्न करने के लिए करते हैं जो आपकी सभी webservice विधियों को अपनी प्रोग्रामिंग भाषा में पसंद करते हैं। इनमें से अधिकतर कोड-जेनरेट किए गए क्लाइंट बहुत नाजुक हैं और यदि वे एक तत्व को पहचानते हैं तो वे अपवाद फेंकना चुनेंगे (यानी यह डब्लूएसडीएल में नहीं है) इसे अनदेखा करने के बजाय। कुछ अधिक आराम से हैं और यह वास्तव में क्लाइंट तकनीक पर निर्भर करता है जिसका उपयोग वे करते हैं।माइक्रोसॉफ्ट के नए डेटाकंट्रैक्ट के पास अपने ग्राहकों पर विशेष रूप से डेटा रखने के लिए IExtensibleData इंटरफ़ेस है जिसे वे पहचान नहीं पाते हैं, इसलिए वे अज्ञात तत्वों को बड़े पैमाने पर अनदेखा कर देंगे।

SOAP और कोड-जेनरेट क्लाइंट प्रॉक्सी स्वयं को इस तरह की समस्याओं के लिए उधार देती है क्योंकि वे उन ग्राहकों को उत्पन्न करते हैं जो केवल उन बिट्स की बजाय 'पूरी स्कीमा' को समझना चाहते हैं। वैकल्पिक उनके लिए एक्सएमएल का उपयोग करना है पार्सर और बस उन बिट्स को खींचें जिन्हें उन्हें चाहिए।

यदि आपकी वेब सेवा विकास या निरंतर परिवर्तन में है तो एसओएपी वास्तव में आपकी सबसे अच्छी पसंद नहीं है क्योंकि इसका मतलब यह होगा कि प्रत्येक बदलाव के साथ उन्हें अपने सेवा ग्राहकों को पुनर्निर्माण, पुनर्निर्माण और पुनर्निर्माण करना होगा। आपकी परिस्थिति के आधार पर आप आरईएसटी + पीओएक्स (सादा ओल्ड एक्सएमएल) वेब सेवाओं को प्रदान करने पर विचार करना चाहेंगे, इसके बजाय पार्स के लिए आसान है क्योंकि इसमें एसओएपी का ओवरहेड नहीं है, जिसे सामान्य यूआरएल के माध्यम से और पर्यावरण द्वारा उपभोग किया जा सकता है एसओएपी क्लाइंट लाइब्रेरी नहीं है (उदाहरण के लिए AJAX का उपयोग करके सीधे ब्राउज़र में)

+0

मुझे उपरोक्त के साथ असहमत होना चाहिए क्योंकि मुझे PHP के SOAPClient, C# (मोनो/.NET) या पर्ल एसओएपी पुस्तकालयों या जावास्क्रिप्ट के साथ अनुरोध/प्रतिक्रिया में अतिरिक्त तत्वों के साथ कभी समस्या नहीं हुई है (मुझे लगता है कि कम से कम एक सुंदर है जावास्क्रिप्ट में अच्छा क्रॉस ब्राउज़र SOAP क्लाइंट)। सार्वजनिक रूप से सामना करने वाले इंटरफेस के लिए आरईएसटी विकल्प मैशप जैसी चीजों के लिए मूल्यवान टूल हैं लेकिन एसओएपी वेब सेवाओं के लिए एक बेहतर प्रोग्रामेटिक दृष्टिकोण है। –

+1

लैन, यदि आप एक एसओएपी क्लाइंट का उपयोग कर रहे हैं तो आप डब्लूएसडीएल जेनरेट कोड का उपयोग नहीं कर रहे हैं, तो आपका पूरा काम एक बुद्धिमान एक्सएमएल पार्सर का उपयोग कर रहा है ताकि एसओएपी हेडर को पेलोड प्राप्त करने के लिए छोड़ दिया जा सके (बेशक आपको पार्सर नहीं मिल रहा है गतिशील भाषा के साथ त्रुटियां)। यदि यह मामला है तो एसओएपी वेब सेवा के अतिरिक्त परफ ओवरहेड और जटिलता का क्या फायदा है? – mythz

+0

आपका आधार अमान्य है क्योंकि एसओएपी क्लाइंट डब्लूएसडीएल जेनरेट कोड का उपयोग करते हैं, वे अपरिपक्व तत्व मौजूद होने पर त्रुटियों को फेंकने की प्रवृत्ति नहीं करते हैं। वे लगभग सभी इस तरह अभ्यास में काम करते हैं। यह किसी भी तरह से SOAP का उपयोग करने के फायदे को अस्वीकार नहीं करता है क्योंकि बॉयलर प्लेट * सभी को स्वचालित किया जाना चाहिए। इस प्रकार, मैं काउंटर को लागू करना बहुत आसान होगा (जब तक आप आरपीसी/एनकोडेड प्रारूप की तरह कुछ भयानक और बहिष्कृत नहीं करते हैं, जो जटिलता के लिए एसओएपी को बुरी प्रतिष्ठा देता है)। –

0

एक संभावित उत्तर एक्सएसडी के आयात में अमूर्त मॉडल को सक्षम करने के लिए प्रतिस्थापन समूहों का उपयोग करना होगा। ऐसे प्रतिस्थापन समूह को संसाधित करने की संभावना अभी भी उन सेवाओं के आह्वान के साथ उपयोग की जा रही है जिन्हें आप उपयोग कर रहे हैं।

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