मुझे यह देखकर थोड़ा दुख होता है कि 10 साल से अधिक समय के बाद वास्तव में यह बताने का कोई जवाब नहीं है कि ओपी में अनुरोध की गई चीज को REST आर्किटेक्चर में कैसे डिजाइन किया जा सकता है, इसलिए मुझे अब ऐसा करने की आवश्यकता है।
पहली चीजें पहले, क्या है? संक्षिप्त REST या ReST का अर्थ "प्रतिनिधि राज्य स्थानांतरण" है और एक निश्चित प्रतिनिधित्व प्रारूप में संसाधन की स्थिति के आदान-प्रदान को परिभाषित करता है। प्रतिनिधित्व प्रारूप बातचीत की मीडिया प्रकार के लिए ज्वार है। application/html
प्रतिनिधित्व प्रारूप के मामले में , HTML स्वरूपित पाठ सामग्री की एक धारा हो सकती है जो ब्राउज़र में प्रदान की जाती है, शायद कुछ स्थानों पर कुछ तत्वों की स्थिति के लिए कुछ स्टाइलशीट फ़ॉर्मेटिंग लागू करने के बाद।
आरएएसटी सिद्धांत रूप में उस ब्रोज़ेबल वेब का एक सामान्यीकरण है जिसे हम सभी जानते हैं, हालांकि सभी प्रकार के अनुप्रयोगों और न केवल ब्राउज़रों को लक्षित करता है। इसलिए, डिजाइन के अनुसार, वेब पर लागू होने वाली समान अवधारणाएं एक आरईएसटी वास्तुकला पर भी लागू होती हैं। एक सवाल "रैस्टफुल" तरीके से कुछ कैसे प्राप्त किया जाए, इस सवाल का जवाब देने के लिए एक वेब पेज पर कुछ कैसे प्राप्त करें और फिर आवेदन परत पर समान अवधारणाओं को लागू करें।
एक वेब आधारित कैलकुलेटर आमतौर पर कुछ "पेज" से शुरू हो सकता है जो आपको सर्वर में प्रवेश किए गए डेटा भेजने से पहले गणना करने के लिए कुछ मान इनपुट करने की अनुमति देता है। HTML में यह आमतौर पर HTML <form>
तत्वों के माध्यम से प्राप्त किया जाता है जो सेट करने के लिए उपलब्ध मापदंडों पर एक ग्राहक को सिखाता है, इनपुट डेटा भेजने पर आवेदन करने के लिए अनुरोध के साथ ही प्रतिनिधित्व प्रारूप भेजने के लिए लक्ष्य स्थान। यह इस तरह दिख सकता है:
<html>
<head>
...
</head>
<body>
<form action="/../someResource" method="post" enctype="application/x-www-form-urlencoded">
<label for="firstNumber">First number:</label>
<input type="number" id="firstNumber" name="firstNumber"/>
<label for="secondNumber">Second number:</label>
<input type="number" id="secondNumber" name="secondNumber"/>
<input type="submit" value="Add numbers"/>
</form>
</body>
</html>
ऊपर दिए गए नमूने में कहा गया है कि दो इनपुट फ़ील्ड हैं जिन्हें उपयोगकर्ता या किसी अन्य ऑटोमेटा द्वारा भरा जा सकता है, और सबमिट इनपुट तत्व को आमंत्रित करने पर ब्राउज़र इनपुट डेटा को एक application/x-www-form-urlencoded
प्रतिनिधित्व प्रारूप में भेजने का ध्यान रखता है जो भेजा जाता है POST
इस मामले में निर्दिष्ट HTTP अनुरोध विधि के माध्यम से उल्लिखित लक्ष्य स्थान पर । अगर हम में प्रवेश 1
में firstNumber
इनपुट क्षेत्र और 2
में secondNumber
इनपुट क्षेत्र, ब्राउज़र का प्रतिनिधित्व उत्पन्न होगा firstNumber=1&secondNumber=2
और लक्ष्य संसाधन के लिए वास्तविक अनुरोध के शरीर पेलोड के रूप में इस भेजें।
सर्वर को जारी किया गया कच्चा HTTP अनुरोध इस तरह दिख सकता है:
POST /../someResource
Host: www.acme.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 28
Accept: application/html
firstNumber=1&secondNumber=2
सर्वर गणना का प्रदर्शन कर सकता है और एक और HTML पृष्ठ के साथ प्रतिक्रिया कर सकता है जिसमें गणना का परिणाम होता है, क्योंकि अनुरोध ने संकेत दिया कि ग्राहक इस प्रारूप को समझता है।
जैसा कि ब्रेटन ने पहले ही बताया कि "रेस्टफुल" URL या URI जैसी कोई चीज नहीं है। एक यूआरआई / यूआरएल अपनी तरह की चीज है और इसे किसी ग्राहक / उपयोगकर्ता को नहीं देना चाहिए। किसी उपयोगकर्ता के ऊपर कैलकुलेटर के नमूने में बस यह दिलचस्पी नहीं है कि उसे डेटा कहां भेजा जाए, बस इसमें रुचि है कि सबमिट इनपुट फ़ील्ड को ट्रिगर करने पर अनुरोध भेजा जाता है। कार्य करने के लिए आवश्यक सभी आवश्यक जानकारी पहले से ही सर्वर द्वारा दी जानी चाहिए।
एक ब्राउज़र को इस बात की भी जानकारी नहीं हो सकती है कि अनुरोध वास्तव में कुछ इनपुट मापदंडों के साथ एक कैलकुलेटर खिला रहा है, यह किसी प्रकार का एक ऑर्डर फॉर्म हो सकता है जो आदेश देने की प्रक्रिया को जारी रखने के लिए बस अगले फॉर्म का प्रतिनिधित्व करता है या कुछ बिल्कुल अलग तरह का संसाधन। यह बस ऐसे मामले में HTML कल्पना की मांग करता है और यह कम परवाह नहीं कर सकता है कि सर्वर वास्तव में क्या कर रहा है। यह अवधारणा एक ब्राउज़र को एक ही प्रतिनिधित्व प्रारूप का उपयोग करने में सक्षम बनाती है, जैसे कि आपकी पसंदीदा ऑनलाइन दुकान से कुछ सामान ऑर्डर करने, अपने सबसे अच्छे दोस्तों के साथ चैट करने, ऑनलाइन खाते में प्रवेश करने आदि।
Affordance कुछ तत्वों, इस तरह में की इनपुट क्षेत्र मामला है कि आमतौर पर बटन के रूप में प्रदान की गई है, परिभाषित करता है क्या आप इसके साथ करने के लिए करना चाहिए सबमिट करें। बटन या लिंक के मामले में यह मूल रूप से आपको इसे क्लिक करने के लिए कहता है। अन्य तत्व अलग-अलग खर्च बता सकते हैं। इस तरह के खर्च को लिंक-संबंधों के माध्यम से भी व्यक्त किया जा सकता है, जैसे preload
कि एनोटेट लिंक के साथ, जो मूल रूप से एक ग्राहक को बताता है कि यह पहले से ही पृष्ठभूमि में लिंक किए गए संसाधन की सामग्री को लोड कर सकता है क्योंकि उपयोगकर्ता सबसे अधिक संभावना इस सामग्री को ले जाएगा। इस तरह के लिंक संबंध निश्चित रूप से मानकीकृत होने चाहिए या वेब लिंकिंग द्वारा परिभाषित संबंध प्रकारों के लिए विस्तार तंत्र का पालन करना चाहिए ।
ये मूलभूत अवधारणा हैं जो वेब पर उपयोग की जाती हैं और जिनका उपयोग REST आर्किटेक्चर में भी किया जाना चाहिए। "अंकल बॉब" रॉबर्ट सी। मार्टिन के अनुसार एक आर्किटेक्चर इरादे के बारे में है और REST आर्किटेक्चर के पीछे का उद्देश्य सर्वर से क्लाइंट्स का डिकॉउलिंग है जो सर्वर को भविष्य में स्वतंत्र रूप से विकसित करने की अनुमति देता है, ताकि उन्हें ग्राहकों को तोड़ने का डर न हो। दुर्भाग्यवश इसके लिए बहुत सारे अनुशासन की आवश्यकता होती है क्योंकि युग्मन को शुरू करना या काम पूरा करने के लिए त्वरित-फिक्स समाधान जोड़ना बहुत आसान है। जैसा कि जिम वेबर ने एक आरईएस आर्किटेक्चर में बताया, एक सेवा प्रदाता के रूप में, आपको 70 के दशक के पाठ आधारित कंप्यूटर गेम के समान एक डोमेन एप्लिकेशन प्रोटोकॉल को डिजाइन करने का प्रयास करना चाहिए जो क्लाइंट किसी प्रक्रिया के अंत तक पहुंचने तक का पालन करेंगे।
दुर्भाग्य से तथाकथित "REST" एपीआई वास्तव में सब कुछ है लेकिन ऐसा है। आप ज्यादातर JSON आधारित डेटा के आदान-प्रदान को देखते हैं जो कि एपीआई विशिष्ट बाहरी दस्तावेज में निर्दिष्ट होता है जो आमतौर पर फ्लाई पर गतिशील रूप से एकीकृत करने के लिए कठिन होता है। प्रारूप जिसे देखने के लिए अनुरोध की आवश्यकता होती है, बाहरी दस्तावेज में भी हार्डकोड किया गया है, जो पूर्ववर्ती प्रकारों को वापस करने के लिए यूआरआई की व्याख्या करने के लिए बहुत सारे कार्यान्वयन की ओर ले जाता हैइसके बजाय कुछ सामान्य प्रतिनिधित्व प्रारूप का उपयोग किया जाता है, जो कि अग्रिम बातचीत की जाती है। यह सर्वरों को बदलने से रोकता है क्योंकि ग्राहक अब एक निश्चित डेटा प्रारूप प्राप्त करने की उम्मीद करते हैं (पूर्वनिर्धारित यूआरआई के लिए प्रतिनिधित्व प्रारूप नहीं!)। यह कस्टम डेटा प्रारूप विनिमय इसके अलावा ग्राहकों को अन्य एपीआई के साथ बातचीत करने से रोकता है क्योंकि "डेटा प्रारूप" आमतौर पर एक विशिष्ट एपीआई के लिए ज्वार होता है। हम इस अवधारणा को अतीत से कोरबा, आरएमआई या एसओएपी जैसी प्रौद्योगिकियों से जानते हैं, जिन्हें हम किसी भी तरह से बुराई के रूप में निंदा करते हैं, हालांकि पेपॉल ने एएस 2 को एएस 4 के साथ हाल ही में डिफ़ॉल्ट ट्रांसफर प्रोटोकॉल के रूप में बदलकर इसे फिर से स्थानांतरित कर दिया।
पूछे गए वास्तविक प्रश्न के संबंध में, सीएसवी फ़ाइल के रूप में डेटा भेजना application/x-www-form-urlencoded
प्रतिनिधित्व या इसी तरह के सामान का उपयोग करने से अलग नहीं है। जिम वेबर ने स्पष्ट किया कि आखिरकार HTTP एक ट्रांसपोर्ट प्रोटोकॉल है जिसका एप्लिकेशन डोमेन वेब पर दस्तावेजों का हस्तांतरण है । क्लाइंट और सर्वर को कम से कम दोनों समर्थन RFC 7111text/csv
में परिभाषित होने चाहिए । यह CSV फ़ाइल एक मीडिया प्रकार के प्रसंस्करण के परिणाम के रूप में उत्पन्न हो सकती है जो फॉर्म एलिमेंट्स, एक लक्ष्य तत्व या विशेषता के साथ-साथ कॉन्फ़िगरेशन को अपलोड करने के लिए HTTP विधि के साथ-साथ अनुरोध भेजने के लिए उत्पन्न होती है।
कुछ प्रकार के मीडिया प्रकार हैं जो HTML , HAL फॉर्म्स , हैलफॉर्म , आयन या हाइड्रा जैसे रूपों का समर्थन करते हैं । मैं वर्तमान में, हालांकि, एक मीडिया प्रकार के बारे में नहीं जानता जो स्वचालित रूप से इनपुट डेटा को text/csv
सीधे सांकेतिक शब्दों में बदलना कर सकता है इसलिए किसी को IANA के मीडिया प्रकार की रजिस्ट्री के साथ परिभाषित और पंजीकृत करने की आवश्यकता हो सकती है ।
पूर्ण पैरामीटर सेट का अपलोड और डाउनलोड मुझे लगता है कि एक मुद्दा नहीं होना चाहिए। जैसा कि पहले उल्लेख किया गया है, लक्ष्य URI प्रासंगिकता का नहीं है क्योंकि एक ग्राहक सिर्फ नई सामग्री को संसाधित करने के लिए URI का उपयोग करेगा। व्यावसायिक तिथि तक फ़िल्टर करना भी मुश्किल नहीं होना चाहिए। हालांकि सर्वर को ग्राहक को उन सभी संभावनाओं के साथ ग्राहक होना चाहिए जो ग्राहक बस से चुना जा सकता है। हाल के वर्षों में ग्राफकॉल और रेस्ट्क्लाइन विकसित हुए जो एक एसक्यूएल को भाषा की तरह पेश करते हैं जिसे फ़िल्टर किए गए प्रतिक्रिया प्राप्त करने के लिए एक निश्चित समापन बिंदु पर लक्षित किया जा सकता है। हालाँकि, एक वास्तविक REST अर्थ में यह REST के पीछे के विचार का उल्लंघन करता है) ग्राफ़कॉलिक यानी केवल एक एकल समापन बिंदु का उपयोग करता है जो किसी भी तरह से कैशिंग और बी के इष्टतम उपयोग को रोकता है) को उपलब्ध फ़ील्ड के ज्ञान की आवश्यकता होती है, जिससे ग्राहकों का युग्मन शुरू हो सकता है। संसाधन का आधार डेटा मॉडल।
कुछ कॉन्फ़िगरेशन मापदंडों को सक्रिय या निष्क्रिय करना हाइपरमीडिया नियंत्रणों को ट्रिगर करने का एक मामला है जो इस खर्च को प्रदान करता है। HTML रूपों में यह एक साधारण चेकबॉक्स या किसी सूची या उस तरह का एक बहु-पंक्ति चयन हो सकता है। प्रपत्र पर निर्भर करता है और यह किस विधि को परिभाषित करता है, इसके बाद संभावित रूप से पूरे कॉन्फ़िगरेशन को भेज PUT
सकता है या किए गए परिवर्तनों के बारे में होशियार हो सकता है और केवल आंशिक डेटा के माध्यम से प्रदर्शन कर सकता है PATCH
। बाद वाले को मूल रूप से एक अद्यतन के लिए प्रतिनिधित्व प्रतिनिधित्व की एक गणना की आवश्यकता होती है और वर्तमान प्रतिनिधित्व को वांछित में बदलने के लिए आवश्यक चरणों के साथ सर्वर को फ़ीड करें। पैठ विनिर्देश के अनुसार यह एक लेनदेन के भीतर किया जाना है ताकि सभी या कोई भी कदम लागू न हों।
HTTP परिवर्तनों को लागू करने से पहले किसी सर्वर को प्राप्त अनुरोध को मान्य करने के लिए अनुमति देता है और प्रोत्साहित करता है। के लिए डाल कल्पना कहता है:
एक मूल सर्वर SHOULD सत्यापित करता है कि PUT प्रतिनिधित्व किसी भी बाधा के अनुरूप है जो सर्वर के पास लक्षित संसाधन के लिए है जो PUT द्वारा बदला नहीं जा सकता है या नहीं बदला जाएगा। यह विशेष रूप से महत्वपूर्ण है जब GET प्रतिक्रियाओं पर मेटाडेटा प्रतिनिधित्व के मूल्यों को निर्धारित करने के लिए मूल सर्वर URI से संबंधित आंतरिक कॉन्फ़िगरेशन जानकारी का उपयोग करता है। जब कोई PUT प्रतिनिधित्व लक्ष्य संसाधन के साथ असंगत होता है, तो मूल सर्वर SHOULD या तो उन्हें सुसंगत बनाता है, प्रतिनिधित्व को परिवर्तित करके या संसाधन कॉन्फ़िगरेशन को बदलकर, या उचित त्रुटि संदेश के साथ जवाब देने के लिए पर्याप्त जानकारी देता है कि प्रतिनिधित्व अनुपयुक्त क्यों है। 409 (संघर्ष) या 415 (असमर्थित मीडिया प्रकार) स्थिति कोड सुझाए गए हैं,
उदाहरण के लिए, यदि लक्ष्य संसाधन को हमेशा "टेक्स्ट / html" के कंटेंट-टाइप के लिए कॉन्फ़िगर किया जाता है और PUT होने का प्रतिनिधित्व कंटेंट-टाइप "इमेज / जेपीईजी" का होता है, तो मूल सर्वर को इनमें से एक करना चाहिए:
ए। नए मीडिया प्रकार को प्रतिबिंबित करने के लिए लक्ष्य संसाधन को फिर से कॉन्फ़िगर करें;
ख। PUT प्रतिनिधित्व को नए संसाधन राज्य के रूप में सहेजने से पहले संसाधन के अनुरूप एक प्रारूप में बदलना; या,
सी। 415 (असमर्थित मीडिया प्रकार) प्रतिक्रिया के साथ अनुरोध को अस्वीकार करें, यह दर्शाता है कि लक्ष्य संसाधन "पाठ / html" तक सीमित है, शायद एक अलग संसाधन के लिए लिंक सहित जो नए प्रतिनिधित्व के लिए उपयुक्त लक्ष्य होगा।
HTTP वास्तव में यह परिभाषित नहीं करता है कि एक PUT विधि मूल सर्वर की स्थिति को कैसे प्रभावित करती है जो उपयोगकर्ता एजेंट अनुरोध के इरादे और मूल सर्वर प्रतिक्रिया के शब्दार्थ द्वारा व्यक्त की जा सकती है। ...
इस पोस्ट को योग करने के लिए, आपको या तो एक मौजूदा मीडिया प्रकार का उपयोग करना चाहिए जो आपको आवश्यक या समर्थित इनपुट मापदंडों के बारे में एक ग्राहक को पढ़ाने की अनुमति देता है, अनुरोध भेजने के लिए लक्ष्य स्थान, ऑपरेशन के साथ-साथ मीडिया-प्रकार का उपयोग करने के लिए। अनुरोध में स्वरूपित किया जाना है, या अपने स्वयं के एक को परिभाषित करना है जिसे आप IANA के साथ पंजीकृत करते हैं। यदि आप इनपुट को कनवर्ट करना चाहते हैं तो बाद वाला आवश्यक हो सकता हैtext/csv
और फिर सर्वर पर CSV प्रतिनिधित्व अपलोड करें। संसाधन में परिवर्तन लागू होने से पहले सत्यापन होना चाहिए। वास्तविक यूआरआई ग्राहकों के लिए प्रासंगिकता के अलावा यह निर्धारित करने के लिए नहीं होना चाहिए कि अनुरोध कहां भेजा जाए और इस तरह से आपको स्वतंत्र रूप से चुना जा सकता है, सेवा कार्यान्वयनकर्ता। इन चरणों का पालन करने से आप किसी भी समय अपने सर्वर साइड को बदलने की स्वतंत्रता प्राप्त कर सकते हैं और यदि वे उपयोग किए गए मीडिया-प्रकारों का समर्थन करते हैं, तो ग्राहक परिणाम के रूप में नहीं टूटेंगे।