कोयले की खान में एक कैनरी।
मैं एक साल से इस तरह के सवाल का इंतजार कर रहा हूं। यह अवश्यंभावी था कि यह दिन आएगा और मुझे यकीन है कि हम आने वाले महीनों में इस तरह के कई और सवाल देखने वाले हैं।
चेतावनी के संकेत
आप बिल्कुल सही हैं, SOAP क्लाइंट की तुलना में RESTful क्लाइंट बनाने में अधिक समय लगता है। SOAP टूलकिट बहुत सारे बॉयलरप्लेट कोड को हटा देते हैं और क्लाइंट प्रॉक्सी ऑब्जेक्ट को लगभग बिना किसी प्रयास के उपलब्ध कराते हैं। विज़ुअल स्टूडियो और सर्वर URL जैसे टूल के साथ, मैं स्थानीय स्तर पर पांच मिनट के भीतर, मनमाने ढंग से जटिलता की दूरस्थ वस्तुओं तक पहुंच सकता हूं।
अनुप्रयोग / xml और अनुप्रयोग / json पर लौटने वाली सेवाएँ क्लाइंट डेवलपर्स के लिए बहुत कष्टप्रद होती हैं। डेटा के उस बूँद के साथ हम क्या करने वाले हैं?
सौभाग्य से, बहुत सी साइटें जो REST सेवाएँ प्रदान करती हैं, क्लाइंट क्लायंट लाइब्रेरीज़ का एक गुच्छा भी प्रदान करती हैं, ताकि हम उन लाइब्रेरियों का उपयोग दृढ़ता से टाइप की गई वस्तुओं के एक समूह तक पहुँच पाने में कर सकें। हालांकि गूंगा लगता है। यदि उन्होंने SOAP का उपयोग किया था, तो हम उन प्रॉक्सी कक्षाओं को स्वयं कोड-जीन कर सकते थे।
सोप ओवरहेड, हा। यह विलंबता है जो मारता है। यदि लोग वास्तव में तार के पार जाने वाले अतिरिक्त बाइट्स की संख्या के बारे में चिंतित हैं, तो शायद HTTP सही विकल्प नहीं है। क्या आपने देखा है कि उपयोगकर्ता-एजेंट हेडर द्वारा कितने बाइट्स का उपयोग किया जाता है?
हाँ, क्या आपने कभी HTML और जावास्क्रिप्ट के अलावा किसी अन्य के लिए डिबगिंग टूल के रूप में वेब ब्राउज़र का उपयोग करने की कोशिश की है। मेरा विश्वास करो यह बेकार है। आप केवल दो क्रियाओं का उपयोग कर सकते हैं, कैशिंग लगातार रास्ते में हो रही है, त्रुटि को संभालने में इतनी जानकारी निगल जाती है, यह लगातार एक गॉडडैम favicon.ico की तलाश में है। बस मुझे गोली मार दो।
पठनीय URL। केवल संज्ञा, कोई क्रिया नहीं। हाँ, यह तब तक आसान है जब तक हम केवल CRUD ऑपरेशन कर रहे हैं और हमें केवल एक तरह से वस्तुओं के पदानुक्रम तक पहुँचने की आवश्यकता है। दुर्भाग्य से अधिकांश अनुप्रयोगों के लिए इससे कहीं अधिक कार्यशीलता की आवश्यकता होती है।
आसन्न आपदा
वर्तमान में विकसित हो रहे डेवलपर्स के एक मेट्रिक बोट लोड हैं जो REST सेवाओं के साथ एकीकृत हैं जो आपके पास उसी निष्कर्ष पर आने की प्रक्रिया में हैं। उन्हें सादगी, लचीलापन, स्केलेबिलिटी, evolvabilty और सीरेंडिपिटस पुन: उपयोग की पवित्र कब्र का वादा किया गया था। वेब की विशेषताएं, कैसे चीजें गलत हो सकती हैं।
हालाँकि, वे यह पता लगा रहे हैं कि संस्करण बनाना एक समस्या के रूप में है, लेकिन संकलक मुद्दों का पता लगाने में मदद नहीं करता है। हाथ से लिखे क्लाइंट कोड को बनाए रखने के लिए एक दर्द है क्योंकि डेटा संरचनाएं विकसित होती हैं और URL फिर से सक्रिय हो जाते हैं। केवल संज्ञाओं और चार क्रियाओं के आसपास एपीआई डिजाइन करना वास्तव में कठिन हो सकता है, विशेष रूप से Restful Url zealots जब आप यह कह सकते हैं कि आप क्वेरी स्ट्रिंग का उपयोग नहीं कर सकते हैं।
डेवलपर्स पूछना शुरू करने जा रहे हैं कि हम अपने प्रयासों को Json प्रारूपों और Xml प्रारूपों दोनों के समर्थन पर क्यों बर्बाद कर रहे हैं, क्यों न केवल एक पर हमारे प्रयासों को केंद्रित करें और इसे अच्छी तरह से करें?
चीजें इतनी गलत कैसे हुईं
मैं बताता हूँ कि क्या गलत हुआ। हम डेवलपर्स के रूप में विपणन विभागों को हमारी प्राथमिक कमजोरी का फायदा उठाने देते हैं। चांदी की गोली के लिए हमारी शाश्वत खोज ने हमें वास्तविकता की ओर अंधा कर दिया कि वास्तव में क्या है। सतह पर REST इतना आसान और सरल लगता है। Urls के साथ अपने संसाधनों को नाम दें और GET, PUT, POST और DELETE का उपयोग करें। नरक, हम देवों को पहले से ही जानते हैं कि यह कैसे करना है, हम वर्षों से डेटाबेस के साथ काम कर रहे हैं जिसमें टेबल और कॉलम और SQL स्टेटमेंट हैं जो SELECT, INSERT, UPDATE और DELETE हैं। यह केक का एक टुकड़ा होना चाहिए था।
REST के अन्य भाग हैं जिन पर कुछ लोग चर्चा करते हैं, जैसे कि आत्म-वर्णनात्मकता और हाइपरमीडिया बाधा, लेकिन ये अवरोध संसाधन पहचान और समान इंटरफ़ेस के रूप में इतने सरल नहीं हैं। जटिलता जोड़ने के लिए प्रतीत होता है जहां वांछित लक्ष्य सादगी है।
REST का यह डाउनग्रेड किया गया संस्करण कई मायनों में डेवलपर संस्कृति में मान्य हो गया। सर्वर फ्रेमवर्क बनाए गए थे जो संसाधन पहचान और समान इंटरफ़ेस को प्रोत्साहित करते थे, लेकिन अन्य बाधाओं का समर्थन करने के लिए कुछ भी नहीं किया। दृष्टिकोणों को विभेदित करने के लिए शर्तें शुरू हुईं, (HI-REST बनाम LO-REST, कॉर्पोरेट REST बनाम अकादमिक परीक्षा, REST बनाम RESTful)।
कुछ लोग चिल्लाते हैं कि यदि आप सभी बाधाओं को लागू नहीं करते हैं तो यह आरईएसटी नहीं है। आपको लाभ नहीं मिलेगा। कोई आधा REST नहीं है। लेकिन उन आवाज़ों को धार्मिक उत्साह के रूप में लेबल किया गया था जो परेशान थे कि उनका कीमती शब्द अश्लीलता से चुरा लिया गया था और मुख्यधारा बना दिया गया था। ईर्ष्या करने वाले लोग REST को ध्वनि से अधिक कठिन बनाने की कोशिश करते हैं।
REST, शब्द, निश्चित रूप से मुख्यधारा बन गया है। लगभग हर बड़ी वेब प्रॉपर्टी जिसमें API होता है, "REST" का समर्थन करती है। ट्विटर और नेटफ्लिक्स दो बहुत ही हाई प्रोफाइल हैं। डरावनी बात यह है कि मैं केवल एक सार्वजनिक एपीआई के बारे में सोच सकता हूं जो स्व-वर्णनात्मक है और कुछ मुट्ठी भर हैं जो वास्तव में हाइपरमीडिया बाधा को लागू करते हैं। निश्चित रूप से कुछ साइटें जैसे StackOverflow और Gowalla उनकी प्रतिक्रियाओं में लिंक का समर्थन करती हैं, लेकिन उनके लिंक में भारी अंतराल छेद हैं। StackOverflow API का कोई मूल पृष्ठ नहीं है। कल्पना करें कि यदि वेब साइट के लिए कोई होम पेज नहीं होता तो वेब साइट कितनी सफल होती!
आपको गुमराह किया गया मुझे डर है
यदि आपने इसे अभी तक बनाया है, तो आपके प्रश्न का संक्षिप्त उत्तर उन एपीआई (नेटफ्लिक्स और ट्विटर) सभी बाधाओं के अनुरूप नहीं है और इसलिए आपको वे लाभ नहीं मिलेंगे, जो REST एप को लाने वाले हैं।
REST क्लाइंट SOAP क्लाइंट की तुलना में अधिक समय तक निर्माण करते हैं, लेकिन वे एक विशिष्ट सेवा से बंधे नहीं होते हैं, इसलिए आपको उन्हें सेवाओं में पुनः उपयोग करने में सक्षम होना चाहिए। क्लासिक उदाहरण लें, एक वेब ब्राउज़र के लिए। वेब ब्राउज़र कितनी सेवाओं तक पहुँच सकता है? फ़ीड रीडर के बारे में क्या? अब औसत ट्विटर क्लाइंट तक कितनी अलग-अलग सेवाएं पहुँच सकती हैं? हाँ, बस एक।
अन्य ग्राहकों को एक एकल सेवा के साथ इंटरफ़ेस करने के लिए नहीं बनाया जाना चाहिए, उन्हें विशिष्ट मीडिया प्रकारों को संभालने के लिए बनाया जाना चाहिए जिन्हें किसी भी सेवा द्वारा सेवा दी जा सकती है। उस के लिए स्पष्ट सवाल है, आप एक सेवा के लिए REST क्लाइंट कैसे बना सकते हैं जो एप्लिकेशन / json या एप्लिकेशन / xml वितरित करता है। खैर आप नहीं कर सकते। ऐसा इसलिए है क्योंकि वे प्रारूप एक REST क्लाइंट के लिए पूरी तरह से बेकार हैं। आपने खुद कहा,
आपको "अनुमान" बनाना होगा कि पाइप में क्या वापस आएगा क्योंकि कोई वास्तविक स्कीमा या संदर्भ दस्तावेज़ नहीं है
आप ट्विटर जैसी सेवाओं के लिए बिल्कुल सही हैं। हालांकि, REST में स्व-वर्णनात्मक बाधा का कहना है कि HTTP सामग्री प्रकार हेडर को उस सामग्री का सटीक वर्णन करना चाहिए जो तार के पार प्रेषित हो रही है। आवेदन / json और अनुप्रयोग / xml वितरित करना आपको सामग्री के बारे में कुछ नहीं बताता है।
जब यह REST आधारित प्रणालियों के प्रदर्शन पर विचार करने की बात आती है तो बड़ी तस्वीर को देखना आवश्यक है। लिफ़ाफ़े बाइट्स के बारे में बात करना लूप अनइंडिंग के बारे में बात करना है जब क्विक-सॉर्ट को शेल-सॉर्ट से तुलना करते हैं। ऐसे परिदृश्य हैं जहां SOAP बेहतर प्रदर्शन कर सकते हैं, और ऐसे परिदृश्य हैं जहां REST बेहतर प्रदर्शन कर सकते हैं। प्रसंग ही सब कुछ है।
REST मीडिया द्वारा किस प्रकार का समर्थन करता है और कैशिंग के लिए परिष्कृत समर्थन होने के बारे में बहुत लचीला होने के कारण अपने प्रदर्शन लाभ का अधिक लाभ उठाता है। अच्छी तरह से काम करने के लिए कैशिंग के लिए हालांकि लगभग सभी बाधाओं का पालन किया जाना चाहिए।
पठनीय यूरल्स के बारे में आपका अंतिम बिंदु अब तक का सबसे विडंबनापूर्ण है। यदि आप वास्तव में हाइपरमीडिया बाधा के लिए प्रतिबद्ध हैं, तो प्रत्येक URL एक GUID हो सकता है और क्लाइंट डेवलपर पठनीयता में कुछ भी नहीं खोएगा।
तथ्य यह है कि URIs क्लाइंट के लिए अपारदर्शी होना चाहिए, REST सिस्टम विकसित करते समय सबसे महत्वपूर्ण चीजों में से एक है। पठनीय URL सर्वर डेवलपर के लिए सुविधाजनक हैं और अच्छी तरह से संरचित URL सर्वर फ्रेमवर्क के लिए अनुरोधों को भेजना आसान बनाते हैं, लेकिन वे कार्यान्वयन विवरण हैं जिनका एपीआई का उपभोग करने वाले डेवलपर्स पर कोई प्रभाव नहीं होना चाहिए।
Twitter API RESTful होने के करीब भी नहीं है और यही कारण है कि आप SOAP पर इसका उपयोग करने में कोई लाभ नहीं देख पा रहे हैं। नेटफ्लिक्स एपीआई बहुत करीब है, लेकिन यह सामान्य मीडिया प्रकारों का उपयोग करता है जो दर्शाता है कि एक भी बाधा का पालन करने में विफल रहने से सेवा से प्राप्त लाभ पर गहरा प्रभाव पड़ सकता है।
हो सकता है यह सब उनकी गलती न हो
मैंने सर्विस प्रोवाइडर्स पर पूरी तरह से डंपिंग की है, लेकिन RESTfully डांस करने में दो लगते हैं। एक सेवा सभी बाधाओं का धार्मिक रूप से पालन कर सकती है और एक ग्राहक अभी भी आसानी से सभी लाभों को पूर्ववत कर सकता है।
यदि एक क्लाइंट हार्ड कोड कुछ प्रकार के संसाधनों तक पहुंचने के लिए आग्रह करता है तो यह सर्वर को उन यूआरएल को बदलने से रोक रहा है। किसी भी प्रकार का URL निर्माण इस बात का निहित ज्ञान पर आधारित है कि सेवा अपने url का उल्लंघन कैसे करती है।
एक लिंक से किस प्रकार के प्रतिनिधित्व को वापस किया जाएगा, इसके बारे में धारणा बनाने से समस्याएं हो सकती हैं। HTTP हेडर में स्पष्ट रूप से नहीं बताए गए ज्ञान के आधार पर प्रतिनिधित्व की सामग्री के बारे में धारणा बनाना निश्चित रूप से युग्मन बनाने जा रहा है जिससे भविष्य में दर्द होगा।
क्या उन्हें SOAP का इस्तेमाल करना चाहिए था?
निजी तौर पर, मुझे ऐसा नहीं लगता। किया गया अधिकार लंबे समय तक वितरित प्रणाली को विकसित करने की अनुमति देता है। यदि आप वितरित सिस्टम का निर्माण कर रहे हैं जिसमें ऐसे घटक हैं जो विभिन्न लोगों द्वारा विकसित किए गए हैं और कई वर्षों तक चलने की आवश्यकता है, तो REST एक बहुत अच्छा विकल्प है।