जाहिर है, आरईएसटी HTTP का उपयोग करने के बारे में सम्मेलनों का एक सेट है । मुझे आश्चर्य है कि इन सम्मेलनों से कौन सा लाभ मिलता है। क्या कोई जानता है?
जाहिर है, आरईएसटी HTTP का उपयोग करने के बारे में सम्मेलनों का एक सेट है । मुझे आश्चर्य है कि इन सम्मेलनों से कौन सा लाभ मिलता है। क्या कोई जानता है?
जवाबों:
मुझे नहीं लगता कि आपको इसका कोई अच्छा जवाब मिलेगा, आंशिक रूप से क्योंकि कोई भी वास्तव में इस बात से सहमत नहीं है कि बाकी क्या है । विकिपीडिया पृष्ठ buzzwords पर भारी और स्पष्टीकरण पर प्रकाश है। चर्चा पृष्ठ केवल एक स्किम के लायक है, यह देखने के लिए कि लोग इस पर कितना असहमत हैं। हालाँकि जहाँ तक मैं बता सकता हूँ, REST का यही अर्थ है:
इसके बजाय बेतरतीब ढंग से नामित सेटर और गेटर यूआरएल होने और का उपयोग कर के GET
सभी टिककर खेल के लिए और POST
setters सभी के लिए, हमें उन URL संसाधनों की पहचान के लिए प्रयास करते हैं, और उसके बाद HTTP क्रियाओं का उपयोग GET
, POST
, PUT
और DELETE
उन्हें सामान करना है। इसलिए इसके बजाय
GET /get_article?id=1
POST /delete_article id=1
तुम करोगे
GET /articles/1/
DELETE /articles/1/
और फिर POST
और PUT
"बनाने" और "अपडेट" संचालन के अनुरूप है (लेकिन कोई भी इस बात से सहमत नहीं है कि कौन सा रास्ता है)।
मुझे लगता है कि कैशिंग तर्क, गलत हैं क्योंकि क्वेरी स्ट्रिंग कर रहे हैं आम तौर पर कैश की गई है, और उन्हें उपयोग करने के लिए इसके अलावा आप वास्तव में जरूरत नहीं है। उदाहरण के लिए django ऐसा कुछ बहुत आसान बनाता है, और मैं यह नहीं कहूंगा कि यह बाकी था:
GET /get_article/1/
POST /delete_article/ id=1
या यहां तक कि क्रिया को URL में शामिल करें:
GET /read/article/1/
POST /delete/article/1/
POST /update/article/1/
POST /create/article/
उस मामले में GET
साइड-इफेक्ट्स के बिना कुछ का मतलब है, और POST
कुछ का मतलब है जो सर्वर पर डेटा को बदलता है। मुझे लगता है कि यह शायद थोड़ा स्पष्ट और आसान है, खासकर जब आप पूरी PUT
-vs- POST
चीज़ से बच सकते हैं । साथ ही अगर आप चाहते हैं तो आप और क्रियाओं को जोड़ सकते हैं, इसलिए आप कृत्रिम रूप से HTTP के लिए बाध्य नहीं हैं। उदाहरण के लिए:
POST /hide/article/1/
POST /show/article/1/
(या जो भी हो, उदाहरणों के बारे में सोचना मुश्किल है जब तक वे नहीं होते!)
इसलिए निष्कर्ष में, केवल दो फायदे हैं जिन्हें मैं देख सकता हूं:
synchronize("/articles/1/")
या जो भी कह सकते हैं । यह आपके कोड पर बहुत अधिक निर्भर करता है।हालाँकि मुझे लगता है कि कुछ बहुत बड़े नुकसान हैं:
PUT
और POST
हैं। अंग्रेजी में उनका मतलब ऐसी ही चीजों से है ("मैं दीवार पर नोटिस लगाने / पोस्ट करने जा रहा हूं।")।इसलिए निष्कर्ष में मैं कहूंगा: जब तक आप वास्तव में अतिरिक्त प्रयास पर नहीं जाना चाहते हैं, या यदि आपकी सेवा सीआरयूडी संचालन के लिए वास्तव में अच्छी तरह से मैप करती है, तो अपने एपीआई के दूसरे संस्करण के लिए रीस्ट को बचाएं।
मुझे सिर्फ REST के साथ एक और समस्या आई: एक अनुरोध में एक से अधिक काम करना आसान नहीं है या यह निर्दिष्ट करना है कि आप किस यौगिक वस्तु को प्राप्त करना चाहते हैं। यह मोबाइल पर विशेष रूप से महत्वपूर्ण है जहां राउंड-ट्रिप-टाइम महत्वपूर्ण हो सकता है और कनेक्शन अविश्वसनीय हैं। उदाहरण के लिए, मान लीजिए कि आपको फेसबुक टाइमलाइन पर पोस्ट मिल रही हैं। "शुद्ध" रीस्ट तरीका कुछ इस तरह होगा
GET /timeline_posts // Returns a list of post IDs.
GET /timeline_posts/1/ // Returns a list of message IDs in the post.
GET /timeline_posts/2/
GET /timeline_posts/3/
GET /message/10/
GET /message/11/
....
जो हास्यास्पद है। Facebook का API बहुत अच्छा IMO है, तो आइए देखें कि वे क्या करते हैं:
डिफ़ॉल्ट रूप से, जब आप क्वेरी बनाते हैं, तो अधिकांश ऑब्जेक्ट गुण वापस आ जाते हैं। आप उन फ़ील्ड (या कनेक्शन) को चुन सकते हैं जिन्हें आप "फ़ील्ड" क्वेरी पैरामीटर के साथ लौटाते हैं। उदाहरण के लिए, यह URL केवल आईडी, नाम और बेन की तस्वीर लौटाएगा: https://graph.facebook.com/bgolub?fields=id,name,picture
मुझे नहीं पता कि आप REST के साथ ऐसा कुछ कैसे करेंगे, और यदि आपने किया कि क्या यह अभी भी REST के रूप में गिना जाएगा। मैं निश्चित रूप से किसी को भी अनदेखा करूँगा जो आपको यह बताने की कोशिश करता है कि आपको ऐसा नहीं करना चाहिए (विशेषकर यदि कारण "क्योंकि यह REST नहीं है")!
/user/{id}
, तो यह आराम करने योग्य नहीं है। विचार करें: क्या आपके ब्राउज़र को यह जानने के लिए पूर्वप्रोग्रामित आना पड़ता है कि स्टैकओवर प्रश्न के लिए HTML कैसे प्राप्त करें। पृष्ठ?
सीधे शब्दों में कहें तो REST का मतलब है HTTP का उपयोग करना जिस तरह से यह होना चाहिए।
REST के बारे में रॉय फील्डिंग के शोध प्रबंध पर एक नज़र डालें । मुझे लगता है कि वेब डेवलपमेंट करने वाले हर व्यक्ति को इसे पढ़ना चाहिए।
एक नोट के रूप में, रॉय फील्डिंग HTTP प्रोटोकॉल के पीछे के प्रमुख ड्राइवरों में से एक है, साथ ही साथ।
कुछ अडवांस का नाम देने के लिए:
सीधे शब्दों में कहें: कोई भी ।
बेझिझक नीचे उतरो, लेकिन मुझे अभी भी लगता है कि गैर-वास्तविक HTTP पर कोई वास्तविक लाभ नहीं हैं। सभी वर्तमान उत्तर अमान्य हैं। वर्तमान में सबसे अधिक वोट दिए गए जवाब से तर्क:
REST के साथ आपको अपने सर्वर-साइड और क्लाइंट-साइड स्क्रिप्ट के लिए अतिरिक्त संचार परत की आवश्यकता है => यह वास्तव में गैर-REST HTTP के उपयोग से अधिक जटिल है।
कैशिंग को HTTP हेडर सर्वर द्वारा भेजे गए द्वारा नियंत्रित किया जा सकता है। REST नॉन-REST में अनुपलब्ध किसी भी सुविधा को नहीं जोड़ता है।
REST आपको चीजों को व्यवस्थित करने में मदद नहीं करता है । यह आपके द्वारा उपयोग किए जा रहे सर्वर-साइड लाइब्रेरी द्वारा समर्थित एपीआई का उपयोग करने के लिए मजबूर करता है । आप अपने एप्लिकेशन को उसी तरह (या बेहतर) व्यवस्थित कर सकते हैं जब आप गैर-रीस्ट दृष्टिकोण का उपयोग कर रहे हों। उदाहरण के लिए मॉडल-व्यू-कंट्रोलर या एमवीसी रूटिंग देखें ।
सच नहीं है। यह सब इस बात पर निर्भर करता है कि आप अपने आवेदन को कितनी अच्छी तरह व्यवस्थित और दस्तावेजित करते हैं। REST जादुई रूप से आपके आवेदन को बेहतर नहीं बनाएगा।
IMHO सबसे बड़ा फायदा जो REST सक्षम करता है, वह क्लाइंट / सर्वर कपलिंग को कम करने में है। मौजूदा क्लाइंट्स को तोड़े बिना समय के साथ REST इंटरफेस को विकसित करना बहुत आसान है।
प्रत्येक संसाधन में अन्य संसाधनों के संदर्भ होते हैं, या तो पदानुक्रम या लिंक में, ताकि आसपास ब्राउज़ करना आसान हो। यह ग्राहक को विकसित करने, डॉक्स से लगातार सलाह लेने और सुझाव देने से बचाने वाले मानव के लिए एक फायदा है। इसका अर्थ यह भी है कि सर्वर संसाधन नामों को एकतरफा बदल सकता है (जब तक क्लाइंट सॉफ़्टवेयर URL को हार्डकोड नहीं करता है)।
आप एपीआई के किसी भी हिस्से में अपना रास्ता बना सकते हैं या संसाधनों को नेविगेट करने के लिए वेब ब्राउज़र का उपयोग कर सकते हैं। डिबगिंग और परीक्षण एकीकरण को बहुत आसान बनाता है।
आपको सही शब्दांकन का शिकार किए बिना कार्यों को निर्दिष्ट करने की अनुमति देता है। कल्पना करें कि OOP प्राप्त करने और बसने का मानकीकरण नहीं किया गया था, और कुछ लोगों ने इस्तेमाल किया retrieve
और define
इसके बजाय। आपको प्रत्येक व्यक्तिगत पहुंच बिंदु के लिए सही क्रिया को याद रखना होगा। यह जानते हुए भी कि उपलब्ध समस्याओं का केवल एक मुट्ठी भर उपलब्ध काउंटर हैं।
यदि आपके पास GET
कोई ऐसा संसाधन है जो मौजूद नहीं है, तो आप 404
RESTful API में त्रुटि प्राप्त कर सकते हैं । इसे नॉन-रेस्टफुल एपीआई के साथ कंट्रास्ट करें, जो हो सकता {error: "Not found"}
है कि भगवान में लिपटे हुए कितने परतों को जानता हो। यदि आपको दूसरी तरफ डेवलपर को संदेश लिखने के लिए अतिरिक्त स्थान की आवश्यकता है, तो आप हमेशा प्रतिक्रिया के शरीर का उपयोग कर सकते हैं।
एक ही कार्यक्षमता के साथ दो एपीआई की कल्पना करें, एक आरईएसटी के बाद और दूसरा नहीं। अब उन एपीआई के लिए निम्नलिखित ग्राहकों की कल्पना करें:
RESTful:
GET /products/1052/reviews
POST /products/1052/reviews "5 stars"
DELETE /products/1052/reviews/10
GET /products/1052/reviews/10
एचटीटीपी:
GET /reviews?product_id=1052
POST /post_review?product_id=1052 "5 stars"
POST /remove_review?product_id=1052&review_id=10
GET /reviews?product_id=1052&review=10
अब निम्नलिखित प्रश्नों पर विचार करें:
यदि प्रत्येक क्लाइंट के पहले कॉल ने काम किया, तो आप कैसे सुनिश्चित कर सकते हैं कि बाकी काम करेंगे?
एपीआई के लिए एक बड़ा अपडेट था जो उन एक्सेस पॉइंट्स को बदल भी सकता था और नहीं भी कर सकता था। आपको कितने डॉक्स फिर से पढ़ने होंगे?
क्या आप अंतिम क्वेरी की वापसी की भविष्यवाणी कर सकते हैं?
आपको पोस्ट की गई समीक्षा (इसे हटाने से पहले) संपादित करनी होगी। क्या आप डॉक्स की जांच किए बिना ऐसा कर सकते हैं?
मैं रयान टोमाको की हाउ आई एक्सप्लेड रेस्ट टू माय वाइफ पर एक नज़र डालने की सलाह देता हूं
Waybackmaschine लिंक से अंश:
एक उदाहरण के बारे में कैसे। आप एक शिक्षक हैं और छात्रों का प्रबंधन करना चाहते हैं:
यदि सिस्टम वेब-आधारित हैं, तो संभवतः इसमें शामिल प्रत्येक संज्ञा के लिए एक URL है student, teacher, class, book, room, etc
:। ... यदि प्रत्येक URL के लिए एक मशीन पठनीय प्रतिनिधित्व होता है, तो यह सिस्टम पर नए टूल को लागू करने के लिए तुच्छ होगा क्योंकि यह सभी जानकारी एक मानक तरीके से उपभोग्य होगी। ... आप एक देशव्यापी प्रणाली का निर्माण कर सकते थे जो परीक्षण स्कोर एकत्र करने के लिए व्यक्तिगत स्कूल प्रणाली में से प्रत्येक से बात करने में सक्षम थी।
प्रत्येक सिस्टम एक सरल HTTP GET का उपयोग करके एक दूसरे से जानकारी प्राप्त करेगा। यदि एक सिस्टम को किसी अन्य सिस्टम में कुछ जोड़ने की आवश्यकता होती है, तो वह HTTP POST का उपयोग करेगा। यदि कोई सिस्टम किसी अन्य सिस्टम में कुछ अपडेट करना चाहता है, तो वह HTTP PUT का उपयोग करता है। केवल यह जानने के लिए कि डेटा कैसा दिखना चाहिए।
मैं हर किसी को सुझाव दूंगा, जो इस प्रश्न का उत्तर ढूंढ रहा है, इस "स्लाइड शो" से गुजरें ।
मैं समझ नहीं पाया कि REST क्या है और यह इतना अच्छा क्यों है, इसके पेशेवरों और विपक्ष, SOAP से मतभेद - लेकिन यह स्लाइड शो इतना शानदार और समझने में आसान था, इसलिए यह मेरे लिए पहले की तुलना में अब बहुत अधिक स्पष्ट है।
भंडारित करता है।
REST के अन्य गहरे लाभ हैं जो ढीले युग्मन और हाइपरटेक्स्ट के माध्यम से विकसित-क्षमता के चारों ओर घूमते हैं, लेकिन कैशिंग तंत्र मुख्य कारण हैं जो आपको Restful HTTP के बारे में ध्यान देना चाहिए।
GET /get_article/19/
और POST /update_article
अगर कैशिंग आपकी चिंता है। तुम अब भी बस के साथ सब कुछ कर सकते हैं GET
और POST
और मेरा मानना है कि REST
"उपयोग का मतलब है GET
, POST
, PUT
और DELETE
केवल।" और न केवल "क्वेरी स्ट्रिंग का उपयोग न करें।" इसलिए मैंने जो सुझाव दिया वह नहीं होगा REST
। फिर से, कोई भी वास्तव में सहमत नहीं हो सकता REST
है इसलिए मैं इसे "वेब 2.0" के साथ एक बाल्टी में डाल रहा हूं।
यह फील्डिंग शोध प्रबंध में लिखा गया है । लेकिन अगर आप बहुत कुछ नहीं पढ़ना चाहते हैं:
केवल POST और GET के साथ सब कुछ करना संभव है? हां, क्या यह सबसे अच्छा तरीका है? क्यों नहीं? क्योंकि हमारे पास मानक तरीके हैं। यदि आप फिर से सोचते हैं, तो केवल GET का उपयोग करके सब कुछ करना संभव होगा .. तो हमें POST का उपयोग करने से क्यों परेशान होना चाहिए? मानकों के कारण!
उदाहरण के लिए, आज एक एमवीसी मॉडल के बारे में सोचते हुए, आप अपने आवेदन को केवल विशिष्ट प्रकार की क्रियाओं जैसे POST, GET, PUT और DELETE पर प्रतिक्रिया देने के लिए सीमित कर सकते हैं। यहां तक कि अगर हुड के नीचे सब कुछ POST और GET के लिए उत्सर्जित होता है, तो अलग-अलग क्रियाओं के लिए अलग-अलग क्रियाएं करने का कोई मतलब नहीं है?
REST में डिस्कवरी बहुत आसान है। हमारे पास WADL दस्तावेज़ (पारंपरिक वेब सेवाओं में WSDL के समान) हैं जो आपको दुनिया में अपनी सेवा का विज्ञापन करने में मदद करेंगे। आप UDDI खोजों का भी उपयोग कर सकते हैं। पारंपरिक HTTP POST और GET से लोग आपके कॉल करने के लिए आपके संदेश अनुरोध और प्रतिक्रिया स्कीमा को नहीं जान सकते हैं।
@Timmmm, आपके संपादन के बारे में:
GET /timeline_posts // could return the N first posts, with links to fetch the next/previous N posts
यह नाटकीय रूप से कॉल की संख्या को कम करेगा
और कुछ भी नहीं आप एक सर्वर है कि अपने ग्राहकों को चाहते हो सकता है क्षेत्र मान निरूपित करने के लिए HTTP मापदंडों को स्वीकार करने से रोकता है ...
लेकिन यह एक विस्तार है।
बहुत अधिक महत्वपूर्ण तथ्य यह है कि आपने आरईएस वास्तुशिल्प शैली के बहुत बड़े फायदे का उल्लेख नहीं किया (बहुत बेहतर मापनीयता, सर्वर स्टेटलेसनेस के कारण; बहुत बेहतर उपलब्धता, सर्वर स्टेटलेसनेस के कारण भी; मानक सेवाओं का बहुत बेहतर उपयोग, जैसे कि कोचिंग; उदाहरण, जब एक REST आर्किटेक्चरल स्टाइल का उपयोग करते हैं, तो क्लाइंट और सर्वर के बीच बहुत कम युग्मन, एक समान इंटरफ़ेस के उपयोग के कारण; आदि);
अपनी टिप्पणी के लिए के रूप में
"सभी क्रियाएं आसानी से CRUD में नहीं बनती (बनाएं, पढ़ें / पुनः प्राप्त करें, अपडेट करें, हटाएं)।"
: RDBMS एक CRUD दृष्टिकोण, (SELECT / INSERT / DELETE / UPDATE) का उपयोग करता है, और डेटा मॉडल का प्रतिनिधित्व करने और कार्य करने का एक तरीका हमेशा होता है।
अपनी सजा के बारे में
"आप ऑब्जेक्ट प्रकार के संसाधनों के साथ भी व्यवहार नहीं कर सकते हैं"
: एक आकर्षक डिजाइन, सार रूप में, एक साधारण डिजाइन है - लेकिन इसका मतलब यह नहीं है कि इसे डिजाइन करना सरल है। आपको फर्क दिखता हैं ? आपको उन अवधारणाओं के बारे में बहुत कुछ सोचना होगा जो आपके आवेदन का प्रतिनिधित्व करेंगे और संभाल लेंगे, इसके द्वारा क्या किया जाना चाहिए, यदि आप पसंद करते हैं, तो संसाधनों के माध्यम से इसका प्रतिनिधित्व करने के लिए। लेकिन अगर आप ऐसा करते हैं, तो आप एक अधिक सरल और कुशल डिजाइन के साथ समाप्त हो जाएंगे।
खोज इंजन द्वारा क्वेरी-स्ट्रिंग्स को अनदेखा किया जा सकता है।