यह समझने में थोड़ा उलझन में है कि मैंने उन सभी तरीकों के आधार पर REST का ठीक से उपयोग कैसे किया है जो मैंने बड़ी कंपनियों को अपने REST API को डिज़ाइन करते हुए देखा है।
आप सही हैं कि REST एक संसाधन संग्रह प्रणाली है। यह प्रतिनिधि राज्य हस्तांतरण के लिए खड़ा है। अगर आप मुझसे पूछें तो कोई बड़ी परिभाषा नहीं। लेकिन मुख्य अवधारणाएं 4 HTTP वर्ब हैं और स्टेटलेस हैं।
ध्यान देने वाली महत्वपूर्ण बात यह है कि आपके पास REST के साथ केवल 4 VERBS हैं। ये GET, POST, PUT और DELETE हैं। आपका resendउदाहरण रीस्ट में एक नया वर्ब जोड़ना होगा। यह लाल झंडा होना चाहिए।
प्रश्न 1
यह महसूस करना महत्वपूर्ण है कि आपके REST API के कॉलर को यह पता नहीं होना चाहिए कि PUTआपके संग्रह पर प्रदर्शन करने से ई-मेल उत्पन्न होगा। मेरे लिए एक रिसाव की बू आ रही है। वे जो जान सकते थे, वह यह है कि PUTअतिरिक्त कार्य करने के परिणामस्वरूप जो वे बाद में क्वेरी कर सकते थे। उन्हें GETहाल ही में बनाए गए संसाधन पर प्रदर्शन करके यह पता चलेगा । यह GETसंसाधन को लौटाएगा और Taskसंसाधन आईडी के सभी इसके साथ जुड़े होंगे। आप बाद में उन कार्यों को उनकी स्थिति निर्धारित करने के लिए क्वेरी कर सकते हैं और एक नया सबमिट भी कर सकते हैं Task।
आपके पास कुछ विकल्प हैं।
REST - कार्य संसाधन आधारित दृष्टिकोण
एक tasksसंसाधन बनाएँ जिसमें आप कार्य करने के लिए अपने सिस्टम में विशिष्ट कार्य प्रस्तुत कर सकें। फिर आप GETइस पर आधारित कार्य को IDयह निर्धारित करने के लिए लौटा सकते हैं कि यह स्थिति है।
या आप SOAP over HTTPअपने आर्किटेक्चर में कुछ आरपीसी जोड़ने के लिए एक वेब सेवा में मिश्रण कर सकते हैं ।
किसी विशिष्ट संसाधन के लिए सभी कार्यों के लिए क्वेरी करना
GET http://server/api/myCollection/123/tasks
{ "tasks" :
[ { "22333" : "http://server/api/tasks/223333" } ]
}
कार्य संसाधन उदाहरण
PUT http://server/api/tasks
{
"type" : "send-email" ,
"parameters" :
{
"collection-type" : "foo" ,
"collection-id" : "123"
}
}
==> कार्य का आईडी लौटाता है
223334
GET http://server/api/tasks/223334
{
"status" : "complete" ,
"date" : "whenever"
}
REST- क्रियाओं को ट्रिगर करने के लिए POST का उपयोग करना
आप हमेशा POSTकिसी संसाधन के लिए अतिरिक्त डेटा ले सकते हैं । मेरी राय में यह REST की भावना का उल्लंघन होगा लेकिन यह अभी भी अनुपालन होगा।
आप इसके समान एक POST कर सकते हैं:
POST http://server/api/collection/123
{ "action" : "send-email" }
आप अतिरिक्त डेटा के साथ संग्रह से संसाधन 123 को अद्यतन कर रहे होंगे। वह अतिरिक्त डेटा अनिवार्य रूप से एक क्रिया है जो बैकएंड को उस संसाधन के लिए एक ईमेल भेजने के लिए कहती है।
इस मुद्दे पर मेरे पास यह है कि GETसंसाधन पर यह अपडेट किया गया डेटा वापस आ जाएगा। हालाँकि, यह आपकी आवश्यकताओं को हल करेगा और अभी भी Restful होगा।
SOAP - वेब सेवा जो REST से प्राप्त संसाधनों को स्वीकार करती है
एक नया WebService बनाएं जिसमें आप REST API से पिछली संसाधन आईडी के आधार पर ई-मेल भेज सकते हैं। मैं यहाँ SOAP के बारे में विस्तार से नहीं जाऊँगा क्योंकि मूल प्रश्न REST के बारे में है और इन दोनों अवधारणाओं / तकनीकों की तुलना सेब और संतरे के रूप में नहीं की जानी चाहिए ।
प्रश्न 2
आपके पास यहां कुछ विकल्प भी हैं:
यह कई बड़ी कंपनियों को प्रकट करता है जो REST API को प्रकाशित करते हैं जो एक searchसंग्रह को उजागर करते हैं जो संसाधनों को वापस करने के लिए क्वेरी मापदंडों में पारित करने का एक तरीका है।
GET http://server/api/search?q="type = myCollection & someField >= someval"
जो पूरी तरह से योग्य REST संसाधनों का एक संग्रह लौटाएगा जैसे:
{
"results" :
{ [
"location" : "http://server/api/myCollection/1",
"location" : "http://server/api/myCollection/9",
"location" : "http://server/api/myCollection/56"
]
}
}
या आप एमवीईएल जैसे कुछ को क्वेरी पैरामीटर के रूप में अनुमति दे सकते हैं ।
प्रश्न 3
मैं एक उप-स्तरों को पसंद करता हूं ताकि एक पैरामीटर को क्वेरी पैरामीटर के साथ वापस जाना और अन्य संसाधन की तुलना में हो सके। मैं नहीं मानता कि कोई एक तरीका या कोई नियम है। आप दोनों तरीकों को लागू कर सकते हैं और कॉल करने वाले को यह तय करने की अनुमति दे सकते हैं कि सिस्टम में पहली बार प्रवेश करने के आधार पर वह अधिक उपयुक्त है।
टिप्पणियाँ
मैं दूसरों की पठनीय टिप्पणियों से असहमत हूं। इसके बावजूद कि कुछ लोग सोच सकते हैं कि REST अभी भी मानव उपभोग के लिए नहीं है। यह मशीन की खपत के लिए है। अगर मैं अपने ट्वीट्स देखना चाहता हूं तो मैं ट्विटर्स नियमित वेबसाइट का उपयोग करता हूं। मैं उनके API के साथ REST GET नहीं करता। अगर मैं अपने ट्वीट्स के साथ प्रोग्राम करना चाहता हूं तो मैं उनके REST API का उपयोग करता हूं। हां API को समझा जाना चाहिए, लेकिन आपका gteयह बुरा नहीं है, यह सिर्फ सहज नहीं है।
REST के साथ दूसरी मुख्य बात यह है कि आपको अपने एपीआई में किसी भी बिंदु पर शुरू करने में सक्षम होना चाहिए और समय से पहले अन्य संसाधनों का सटीक URL पता किए बिना अन्य सभी संबद्ध संसाधनों पर नेविगेट करना चाहिए। GETआरईएसटी में वीईआरबी के परिणामों को उन संसाधनों के पूर्ण रीस्ट URL को वापस करना चाहिए जो इसे संदर्भित करते हैं। इसलिए किसी क्वेरी के बजाय किसी Personऑब्जेक्ट की आईडी लौटाने पर , यह पूरी तरह से क्वालिफाइड URL जैसे कि लौटा देगा http://server/api/people/13। फिर आप हमेशा प्रोग्राम को परिणामी रूप से नेविगेट कर सकते हैं भले ही URL बदल गया हो।
टिप्पणी करने के लिए प्रतिक्रिया
वास्तविक दुनिया में वास्तव में ऐसी चीजें होती हैं जिन्हें बनाने की जरूरत नहीं है, पढ़ें, अपडेट करें या अपडेट करें (CRUD) एक संसाधन।
संसाधनों पर अतिरिक्त कार्रवाई की जा सकती है। विशिष्ट संबंधपरक डेटाबेस संग्रहीत प्रक्रियाओं की अवधारणा का समर्थन करते हैं। ये अतिरिक्त कमांड हैं जिन्हें डेटा के सेट पर निष्पादित किया जा सकता है। REST के पास स्वाभाविक रूप से वह अवधारणा नहीं है। और कोई कारण नहीं होना चाहिए। इस प्रकार की क्रियाएं RPC या SOAP वेब सेवाओं के लिए एकदम सही हैं।
यह सामान्य समस्या है जिसे मैं REST API के साथ देखता हूं। डेवलपर्स वैचारिक सीमाओं को पसंद नहीं करते हैं जो REST को घेरते हैं इसलिए वे इसे जो कुछ भी करना चाहते हैं उसे करने के लिए अनुकूलित करते हैं। हालांकि यह एक RESTful सेवा होने से टूटता है। अनिवार्य रूप से उन URL के GETछद्म-अनुष्ठान-जैसे सर्वलेट्स पर कॉल बन जाते हैं।
आपके पास कुछ विकल्प हैं:
- कार्य संसाधन बनाएँ
POSTकार्रवाई करने के लिए संसाधन में अतिरिक्त डेटा का समर्थन करें ।
- SOAP वेब सेवा के माध्यम से अतिरिक्त कमांड जोड़ें।
यदि आप एक क्वेरी पैरामीटर का उपयोग करते हैं, जिसे HTTP VERB आप ईमेल को फिर से भेजने के लिए उपयोग करेंगे?
GET- क्या यह ईमेल को फिर से भेज देता है और संसाधन का डेटा वापस कर देता है? क्या होगा यदि कोई सिस्टम उस URL को कैश करता है और उसे उस संसाधन के लिए अद्वितीय URL की तरह मानता है। हर बार जब वे यूआरएल को हिट करते हैं तो यह एक ईमेल को फिर से भेज देगा।
POST - आपने वास्तव में संसाधन के लिए कोई नया डेटा नहीं भेजा, बस एक अतिरिक्त क्वेरी पैरामीटर।
दी गई सभी आवश्यकताओं के आधार पर, एक POST डेटा के रूप POSTमें संसाधन पर action fieldकरने से समस्या हल हो जाएगी।