क्या वास्तव में REST API RPC है? रॉय फील्डिंग लगता है तो


99

मुझे जो कुछ पता चला कि मैं REST के बारे में जानता था, वह बड़ी मात्रा में गलत है - और मैं अकेला नहीं हूँ। इस प्रश्न का एक लंबा लीड-इन है, लेकिन यह आवश्यक प्रतीत होता है क्योंकि जानकारी थोड़ी बिखरी हुई है। यदि आप पहले से ही इस विषय से परिचित हैं तो वास्तविक प्रश्न सबसे अंत में आता है।

रॉय फील्डिंग के REST एपीआई के पहले पैराग्राफ से हाइपरटेक्स्ट-चालित होना चाहिए , यह स्पष्ट है कि उनका मानना ​​है कि उनके काम का व्यापक रूप से गलत अर्थ निकाला जा रहा है:

मैं किसी HTTP- आधारित इंटरफ़ेस को REST API कहने वाले लोगों की संख्या से निराश हो रहा हूं। आज का उदाहरण SocialSite REST API है । वह आरपीसी है। यह RPC चिल्लाती है। डिस्प्ले पर इतना कपलिंग है कि इसे एक्स रेटिंग दी जानी चाहिए।

फ़ील्डिंग एक REST API की कई विशेषताओं को सूचीबद्ध करता है। उनमें से कुछ एसओ और अन्य मंचों पर सामान्य अभ्यास और सामान्य सलाह दोनों के खिलाफ जाते हैं। उदाहरण के लिए:

  • REST API को प्रारंभिक URI (बुकमार्क) से परे कोई पूर्व ज्ञान के साथ दर्ज किया जाना चाहिए और मानकीकृत मीडिया प्रकारों का सेट जो कि इच्छित श्रोताओं के लिए उपयुक्त हो (यानी, किसी भी क्लाइंट द्वारा समझा जा सकता है जो एपीआई का उपयोग कर सकता है)। ...

  • REST API को निश्चित संसाधन नामों या पदानुक्रमों (क्लाइंट और सर्वर का स्पष्ट युग्मन) को परिभाषित नहीं करना चाहिए। ...

  • REST API को अपने सभी वर्णनात्मक प्रयासों को संसाधनों और ड्राइविंग एप्लिकेशन स्थिति का प्रतिनिधित्व करने के लिए उपयोग किए जाने वाले मीडिया प्रकार (ओं) को परिभाषित करने में, या मौजूदा मानक मीडिया प्रकारों के लिए विस्तारित संबंध नामों और / या हाइपरटेक्स्ट-सक्षम मार्क-अप को परिभाषित करने में खर्च करना चाहिए। ...

"हाइपरटेक्स्ट" का विचार केंद्रीय भूमिका निभाता है - यूआरआई संरचना की तुलना में बहुत अधिक या HTTP क्रियाओं का क्या मतलब है। "हाइपरटेक्स्ट" को टिप्पणियों में से एक में परिभाषित किया गया है:

जब मैं [क्षेत्ररक्षण] हाइपरटेक्स्ट कहता हूं, तो मेरा मतलब है सूचना की एक साथ प्रस्तुति और नियंत्रण ऐसा है कि सूचना वह व्यय बन जाती है जिसके माध्यम से उपयोगकर्ता (या ऑटोमेटन) विकल्प प्राप्त करता है और कार्यों का चयन करता है। हाइपरमीडिया केवल एक विस्तार है जो पाठ को मीडिया स्ट्रीम में अस्थायी एंकर शामिल करने का मतलब है; अधिकांश शोधकर्ताओं ने अंतर छोड़ दिया है।

हाइपरटेक्स्ट को ब्राउज़र पर HTML होने की आवश्यकता नहीं है। जब वे डेटा प्रारूप और संबंध प्रकारों को समझते हैं तो मशीनें लिंक का अनुसरण कर सकती हैं।

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

GET   /foos/{id}  # read a Foo
POST  /foos/{id}  # create a Foo
PUT   /foos/{id}  # update a Foo

इसके बजाय, एक एजेंट को सभी Foos के लिए URI की खोज करने के लिए मजबूर किया जाना चाहिए, उदाहरण के लिए, / foos के खिलाफ GET अनुरोध जारी करना। (वे यूआरआई उपरोक्त पैटर्न का पालन करने के लिए बाहर निकल सकते हैं, लेकिन यह उस बिंदु के बगल में है।) प्रतिक्रिया एक मीडिया प्रकार का उपयोग करती है जो यह बताने में सक्षम है कि प्रत्येक आइटम का उपयोग कैसे किया जा सकता है और इसके साथ क्या किया जा सकता है, ऊपर तीसरे बिंदु को जन्म देता है। । इस कारण से, एपीआई प्रलेखन को यह समझाने पर ध्यान केंद्रित करना चाहिए कि प्रतिक्रिया में निहित हाइपरटेक्स्ट की व्याख्या कैसे करें।

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

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

लेकिन इस विशेष क्षण में यह मेरा सबसे अच्छा अनुमान है।

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

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

इसलिए, रीस्ट विशेषज्ञों के लिए दो सरल प्रश्न व्यावहारिक मानसिकता के साथ हैं: आप यह कैसे व्याख्या करते हैं कि फील्डिंग क्या कह रही है और रीस्ट एपीआई को दस्तावेज / लागू करते समय आप इसे कैसे व्यवहार में लाते हैं?

संपादित करें: यह प्रश्न इस बात का एक उदाहरण है कि अगर आप जिस बारे में बात कर रहे हैं, उसके लिए आपके पास नाम नहीं है, तो कुछ सीखना कितना कठिन हो सकता है। इस मामले में नाम "हाइपरमेडिया ऑफ द इंजन ऑफ एप्लीकेशन स्टेट" (HATEOAS) है।


26
जॉन, रिच सिर्फ मानसिकता में बदलाव के बारे में बता रहे हैं जो उनके पास था। इसके बारे में कुछ भी व्यक्तिपरक या तर्कपूर्ण नहीं है। खुले में रखने के लिए वोट करें - मैं एसओ पर देखे गए 'आराम' को टैग किए गए बेहतर सवालों में से एक है।
कीथ गौघन

4
कीथ, "मानसिकता में परिवर्तन की व्याख्या" कुछ ऐसा है जो उसे अपने ब्लॉग में करना चाहिए, एसओ पर नहीं।
जॉन सॉन्डर्स

13
वह अपनी मानसिकता में बदलाव की व्याख्या नहीं कर रहा है, वह पूछ रहा है कि क्या उसकी समझ सटीक है।
aehlke

4
बहुत बढ़िया सारांश। मैंने इस प्रश्न से अधिकांश उत्तरों की तुलना में अधिक सीखा।
मार्टिन कोंकणी

जवाबों:


21

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

दस्तावेज़ीकरण के लिए, यह सवाल काफी बार किया गया है। आप हाइपरलिंक नियंत्रणों के साथ अपने मीडिया प्रकार को दस्तावेज़ित करते हैं, जिसमें यह शामिल है (लिंक और रूप), और यदि आप चाहें तो इंटरेक्शन मॉडल (एटमपब देखें)।

यदि आप URI का दस्तावेज़ बनाते हैं या उन्हें कैसे बनाते हैं, तो आप इसे गलत कर रहे हैं।


क्या यह अभी भी सच है? Ionspec की तरह एपीआई प्रतिक्रिया चश्मा हैं जिन्होंने जानबूझकर प्रतिक्रिया के हिस्से के रूप में इन यूआरआई को बनाया है।
सीन पियानका

हाँ उनके पास है। उस बिंदु पर यह पता लगाने का सवाल है कि क्या उन दस्तावेज URI को आवेदन के लिए सिर्फ प्रविष्टि दी जाती है, जिन्हें रहने की गारंटी दी जाती है (उनमें से कुछ असामान्य और बहुत उपयोगी नहीं हैं) या यदि, क्योंकि लोग कोड पीढ़ी चाहते हैं, तो वे एम्बेडेड हैं सीधे कोड में एक युक्ति, सर्वर को क्लाइंट को यह बताने से रोकती है कि वह चीजों को कैसे कर सकता है। यदि ग्राहक को लगता है कि यह उस अनुबंध के कारण जानता है, तो आप हाइपरमीडिया में नहीं हैं, आप आधुनिक दिन के ओपनैपी साबुन मॉडल में हैं, उसी मुद्दे के साथ जो आपने 18 साल पहले सामना किया था।
सीरियलबेल

यह सच है कि पिछले 11 वर्षों में कई एपीआई प्रलेखन भाषाओं का विस्तार हुआ है, लेकिन मूल सिद्धांतों में बदलाव नहीं हुआ है। मेरा मानना ​​है कि उन लिंक की खोज में या बहुत कम यूआरआई टेम्पलेट खोज में मूल्य पुन: प्रयोज्य जेनेरिक क्लाइंट कोड के निर्माण में है, जो गतिशील रूप से उन का उपयोग कर सकता है, जिससे सर्वर क्लाइंट पर कई कार्यान्वयन समान क्लाइंट कोड का पुन: उपयोग करने की अनुमति देता है। यूआरआई एम्बेडिंग ऐसे परिदृश्यों को कठिन बना रहा है, लेकिन यदि आप उन प्रारूपों का उपयोग करते हैं, तो आप उन स्पेक्स से उत्पन्न क्लाइंट को कसकर जोड़ते हैं, इसलिए आप उस सुविधा को पहले ही खो चुके हैं।
सीरियलबेल

8

आपकी व्याख्या मुझे सही लगती है। मेरा मानना ​​है कि फील्डिंग की बाधाओं को व्यावहारिक रूप से लागू किया जा सकता है।

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


2
वाह। उस रिसोर्स मॉडल पेज ने मेरी आंखों में आंसू ला दिए। चलिए आशा करते हैं कि यह एक प्रवृत्ति है।
डारेल मिलर

यह शर्म की बात है कि यह मूल रूप से वेब पर इस तरह के एपीआई का एकमात्र उदाहरण है! इससे भी बदतर, ग्राहक कोड का कोई अच्छा उदाहरण नहीं है जो सिद्धांत का पालन करता है (जो मैंने पाया है)।
15

1
@DarrelMiller लेकिन वे मीडिया प्रकार भी "विशिष्ट" नहीं हैं? यह मुझे लगता है कि उनका एपीआई वास्तव में केवल एक ही समय का उपयोग कर रहा है: application/jsonऔर यह कि संसाधन मॉडल वास्तव में संबंध हैं। क्या मैंने REST के इस पहलू को गलत समझा? मैंने आपका एक SO उत्तर भी पढ़ा है जो यह
बताता है

2
@RichApodaca आपका लिंक पेचिश से मर गया है। web.archive.org/web/20170409132237/https://kenai.com/projects/…
forresthopkinsa

5

मैं HATEOAS के बाद लिखे गए API के एक अच्छे उदाहरण की तलाश में हूं और उसे ढूंढने में परेशानी हुई (मुझे "सामान्य" API स्थिति में लागू करने के लिए SunCloud API और AtomPub दोनों सामान मुश्किल से मिले)। इसलिए मैंने अपने ब्लॉग पर एक वास्तविक उदाहरण बनाने की कोशिश की जो रॉय फील्डिंग की सलाह का पालन करता है कि इसका उचित रीस्ट कार्यान्वयन होने का क्या मतलब है। मुझे इस उदाहरण के साथ आना बहुत मुश्किल लगा, इस तथ्य के बावजूद कि यह सिद्धांत में काफी सरल है (बस एक वेबपेज के विपरीत एपीआई के साथ काम करते समय भ्रमित करना)। मुझे लगता है कि रॉय किस मुद्दे पर सहमत थे और सहमत थे, यह एक एपीआई के लिए ठीक से लागू करने की मानसिकता में बदलाव है।

एक नज़र रखना: बाकी का उपयोग करके एपीआई उदाहरण


4

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

REST और संबंधित HATEOAS पर कुछ अच्छी चर्चा:

RESTFul API में HATEOAS का उपयोग करने के फायदे (इसके अलावा)

एक कप कॉफी कैसे प्राप्त करें



4

जो चीज ज्यादातर लोगों को गलत लगती है वह यह है कि (कम से कम मुझे लगता है) REST की दुनिया में आप अपने "रेस्ट इंटरफेस" का दस्तावेज नहीं बनाते हैं, जो आप दस्तावेज़ करते हैं वह एक मीडिया प्रकार है, स्वतंत्र रूप से आपके सर्वर या सेवा का।


2

मुझे लगता है कि जितने वर्षों में REST अब बाहर है, प्रौद्योगिकीविदों को एक संसाधन की अवधारणा के बारे में पता चला है और वास्तव में RESTful क्या है या नहीं है।

रिचर्डसन मैच्योरिटी मॉडल के अनुसार, 4 स्तर (0-3) हैं जो परिभाषित करते हैं कि RESTful आपका API कैसा है, 3 अर्थ के साथ वास्तव में RESTful API है, जैसा कि रॉय फील्डिंग का इरादा था।

स्तर 0 तब होता है जब आपके पास एक प्रविष्टि बिंदु URI होता है - SOAP की तरह।

स्तर 1 का अर्थ है कि एपीआई विभिन्न संसाधनों के बीच अंतर करने में सक्षम है, और एक से अधिक प्रवेश बिंदु हैं - अभी भी SOAP की बदबू आ रही है।

स्तर 2 जब आप HTTP क्रियाओं का उपयोग करते हैं - GET, POST, DELETE मुख्य रूप से। यह वह स्तर है जिस पर वास्तव में REST चित्र में आता है।

स्तर 3 पर, आप अपने एपीआई को सही मायने में बनाने के लिए हाइपरमीडिया नियंत्रण का उपयोग करना शुरू करते हैं ।

आगे पढ़ने के लिए सुझाए गए लिंक:


1

बिलकुल सही। मैं इस बात पर ध्यान देता हूं कि URI टेम्प्लेट एक RESTful एप्लिकेशन के भीतर पूरी तरह से ठीक हैं, जब तक कि पैटर्न सर्वर से प्राप्त दस्तावेजों से हैं (OpenSearch एक उपयुक्त उदाहरण है)। URI टेम्प्लेट के लिए, आप दस्तावेज़ बनाते हैं कि उनका उपयोग कहाँ किया जा रहा है और टेम्पलेट में अपेक्षित प्लेसहोल्डर क्या हैं, लेकिन स्वयं टेम्प्लेट नहीं। वेन्फ्राइडेन ने जो कहा उसके विपरीत, यह कोई अपवाद नहीं है।

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

आपके प्रश्न पर: हमारा आदर्श दस्तावेज़ीकरण संसाधनों को उजागर करता है, उन संसाधनों पर विभिन्न तरीकों का प्रभाव, और प्रतिनिधित्व मीडिया प्रकार का उपयोग किया जाता है और उनके स्कीमा, और उन अभ्यावेदन में यूआरआई किस तरह के संसाधनों को इंगित करते हैं।

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


1
अपने एपीआई, आउट-ऑफ-बैंड के रूप में यूआरआई टेम्प्लेट प्रदान करना ठीक है। बस कृपया इसे रेस्ट के रूप में संदर्भित न करें, क्योंकि यह नहीं है। यह युग्मन की एक बड़ी मात्रा है, और इससे बचने के लिए वास्तव में क्या बनाया गया था। लेकिन जैसा कि आप कहते हैं, REST हर एप्लिकेशन के लिए नहीं है। तो हर आवेदन का नाटक नहीं है बाकी है।
aehlke

1
दरअसल, मैं सहमत हूं। मुझे विश्वास है कि मैंने वही कहा है। हालाँकि, मैं वास्तव में URI टेम्प्लेट आउट-ऑफ-बैंड प्रदान करने का कोई अच्छा कारण नहीं देख सकता।
कीथ गौघन

0

मान GET /foos/createFormलेते हैं कि फॉर्म फ़ील्ड मान प्राप्त करने के लिए आमंत्रित किया जाता है, जिसके लिए हमें प्रदान करने के लिए जाना चाहिए POST /foos। अब इस विशेष URL यानी 1 का उपयोग किया जाता है, जिसे GET /foos/createFormFielding के प्रस्ताव के अनुसार सबमिट एक्शन लिंक के रूप में प्रतिक्रिया के लिए उल्लेख किया जाना चाहिए , है ना?
फिर अच्छी तरह से ज्ञात Http क्रियाओं के लिए मैपिंग क्रियाओं का लाभ क्या है, "कोड / कॉन्फिगरेशन से अधिक कन्वेंशन" चीज़ अशक्त है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.