एक RESTful सेवा में गैर-CRUD संचालन


106

नॉन-सीआरयूडी संचालन को एक रेस्टफुल सेवा में जोड़ने का "रेस्टफुल" तरीका क्या है? कहो कि मेरे पास एक ऐसी सेवा है जो CRUD को इस तरह रिकॉर्ड करने की अनुमति देती है:

GET /api/car/123           <- Returns information for the Car object with ID 123
POST /api/car              <- Creates a new car (with properties in the request)
PUT /api/car/123           <- Updates car 123 (with properties in the request)
DELETE /api/car/123        <- Deletes car 123    
POST /api/car/123/wheel/   <- Creates a wheel and associates it to car 123

अगर मैं कार का रंग बदलना चाहता हूं, तो मैं बस POST /api/car/123नए रंग के लिए एक POST चर शामिल करूंगा ।

लेकिन मान लीजिए कि मैं एक कार खरीदना चाहता हूं, और यह ऑपरेशन केवल "उपयोगकर्ता" रिकॉर्ड की "स्वामित्व वाली कार" संपत्ति को अपडेट करने से अधिक जटिल है। क्या यह केवल कुछ करना पसंद है POST /api/car/123/purchase, जहां "खरीद" अनिवार्य रूप से एक विधि का नाम है? या क्या मुझे PURCHASEइसके बजाय एक कस्टम HTTP क्रिया का उपयोग करना चाहिए POST?

या गैर-सीआरयूडी ऑपरेशन पूरी तरह से आरईएसटी के दायरे से बाहर हैं?


5
यदि आप कार का रंग बदल रहे हैं, तो PATCH /api/car/123रंग पैरामीटर का उपयोग करना और भेजना बेहतर होगा या PUT /api/car/123संपूर्ण कार ऑब्जेक्ट को उपयोग करें और भेजें। POST यह अनुमान लगाएगा कि आप एक नई कार बना रहे हैं और संभवतः URL के अंत में कभी भी आईडी शामिल नहीं करना चाहिए
RonnyKnoxville

जवाबों:


65

एक व्यावसायिक इकाई या Restful शब्दकोश में एक संसाधन के रूप में खरीद के बारे में सोचो । कहा जा रहा है कि खरीदारी करना वास्तव में एक नया संसाधन बना रहा है। इसलिए:

POST /api/purchase

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

इससे कोई फर्क नहीं पड़ता कि कार ऑर्डर करना डेटाबेस में सिर्फ एक सरल INSERT नहीं है। दरअसल, REST आपके डेटाबेस तालिकाओं को CRUD संचालन के रूप में उजागर करने के बारे में नहीं है। तार्किक दृष्टिकोण से आप एक ऑर्डर (खरीद) बना रहे हैं, लेकिन सर्वर साइड कई प्रोसेसिंग चरणों के लिए स्वतंत्र है जैसा वह चाहता है।

आप आगे भी HTTP प्रोटोकॉल का दुरुपयोग कर सकते हैं। Locationनए बनाए गए ऑर्डर के लिंक को वापस करने के लिए हेडर का उपयोग करें , उपयोगकर्ताओं को समस्याओं (सर्वर- या क्लाइंट-साइड), आदि के बारे में सूचित करने के लिए सावधानीपूर्वक HTTP प्रतिक्रिया कोड चुनें।


3
REST संसाधनों की स्थिति में हेरफेर करने के बारे में है और हर व्यवसाय संचालन को CRUD संचालन के लिए मैप किया जाना है। यदि आपको कठिन व्यवसाय संचालन शब्दार्थ की आवश्यकता है , तो आपको SOAP तरीका जाना होगा (SOAP वास्तव में संदेश पारित करना है, लेकिन आम तौर पर अनुरोध-प्रतिक्रिया संचालन में आयोजित किया जाता है)।
टॉमाज़ नर्कविक्ज़ जूल 27'11

23
"संसाधन के रूप में खरीद" डिजाइन साफ ​​दिखता है। क्या होगा यदि संसाधन एक "बीयर" है .. और मैं चाहता हूं कि सर्वर इसे पी जाए .. (यह मेरे लिए था, मैं इसे प्राप्त करूँगा;)) .. हमें संसाधन के रूप में "पेय कार्रवाई" पर विचार करना चाहिए ? .. या "बीयर पी रहा है", एक कठिन व्यवसाय संचालन! " अधिक गंभीरता से, संसाधनों के रूप में कार्यों पर विचार करने के बारे में
Restful डिज़ाइन है

2
आप एक REST सेवा के माध्यम से "खरीद आदेश स्वीकृत" कैसे करेंगे? मुझे लगता है कि @TomaszNurkiewicz सही है कि कुछ भी जो CRUD तरीके से बड़े करीने से नहीं किया जा सकता है, SOAP द्वारा प्रदान किए गए ऑपरेशन-शब्दार्थ की आवश्यकता होगी। जब तक "खरीद आदेश अनुमोदन" अपने आप में एक मॉडल / संस्था नहीं है। उदाहरण के लिए पोस्ट / पीओ-अनुमोदन (अनुरोध में पीओ विवरण के साथ)।
mydoghasworms

2
एक REST ग्राहक के दृष्टिकोण से "खरीद आदेश स्वीकृत करें" आदेश का सिर्फ एक और अद्यतन होना चाहिए। उदाहरण के लिए "स्वीकृत" को "सत्य" में बदलें और सर्वर को अपडेट भेजें। सर्वर को संभवतः चेकों का एक गुच्छा बनाने की आवश्यकता होगी और शायद उसे अन्य संसाधनों का एक गुच्छा अपडेट / बनाने की आवश्यकता होगी। लेकिन यह सर्वर की समस्या है और क्लाइंट को दिखाई नहीं देनी चाहिए।
एवी

2
@antinome: "मान लीजिए कि क्लाइंट को इसमें से कुछ पता है", अगर ऐसा है तो आप REST नहीं कर रहे हैं (यह अभी भी मान्य, समझदार सॉफ़्टवेयर हो सकता है!)। REST को क्लाइंट बनाने में सक्षम होने के लिए डिज़ाइन किया गया था, जो उस तरह की चीज़ को नहीं जानता है, ऐसे क्लाइंट बनाने के लिए जो अभी भी काम करते हैं अगर सर्वर का व्यवहार बदल जाए। जो आप करने की कोशिश कर रहे हैं वह क्लासिक RPC है, आपको या तो अपने दृष्टिकोण की समीक्षा करने की आवश्यकता है ताकि यह REST फिट हो, या स्वीकार करें कि आप RPC कर रहे हैं और SOAP जैसे RPC के लिए इच्छित प्रोटोकॉल का उपयोग करें। RPC RPC न होने के लिए REST बहुत कोशिश करता है, इसलिए जब आप RPC चाहते / चाहते हैं तो यह एक अच्छा फिट होने वाला नहीं है।
एवी

15

Restful तरीका जैसा कि मैं समझता हूँ कि आपको नई HTTP क्रियाओं की आवश्यकता नहीं है, कहीं न कहीं एक संज्ञा है जिसका अर्थ होगा कि आपको क्या करने की आवश्यकता है।

एक कार खरीद? खैर यह नहीं है

POST /api/order

2
PUT का उपयोग संसाधनों को अपडेट करने के लिए नहीं किया जाता है क्योंकि यह एक प्रकार का है? इसका मतलब है कि आप इसे जितनी बार चाहें कॉल कर सकते हैं, लेकिन केवल पहली / आखिरी कॉल महत्वपूर्ण है। दूसरी ओर POST का उपयोग संसाधनों को बनाने के लिए किया जाता है और इसे दो बार कॉल करके वास्तव में दो का निर्माण करना चाहिए।
टॉमाज़ नर्कविक्ज़ जूल

1
@ टॉमा, हां, टाइपो। सिद्धांत महत्वपूर्ण है, हालांकि, हम एक नई चीज़, एक आदेश, एक नई क्रिया की कोई आवश्यकता नहीं है।
djna

5

आप वास्तव में क्या कर रहे हैं एक आदेश बना रहा है। इसलिए ऑर्डर और पोस्ट के लिए एक और संसाधन जोड़ें और ऑर्डर प्रक्रिया के दौरान वहां रखें।

विधि कॉल के बजाय संसाधनों के संदर्भ में सोचें।

आदेश को अंतिम रूप देने के लिए आप संभवतः POST / api / आदेश // पूर्ण या कुछ इसी तरह का होगा।


3

मुझे लगता है कि REST API सिर्फ शब्दार्थ प्रदान करने की तुलना में बहुत अधिक तरीकों से मदद करता है। इसलिए आरपीसी शैली को कुछ कॉल के कारण नहीं चुन सकते हैं जो आरपीसी ऑपरेशन शैली में अधिक समझ में आता है। उदाहरण दो स्थानों के बीच दिशाओं को खोजने के लिए गूगल मैप्स एपी है। इस तरह दिखता है: http://maps.googleapis.com/maps/api/directions/json?origin=Jakkur&destination=Hebbal

वे इसे "findDirections" (क्रिया) कह सकते थे और इसे एक ऑपरेशन के रूप में मान सकते थे। बल्कि उन्होंने "दिशा" (संज्ञा) को एक संसाधन के रूप में बनाया और दिशा-निर्देशों के संसाधन पर एक प्रश्न के रूप में दिशाओं का पता लगाया (हालांकि आंतरिक रूप से दिशा नामक कोई वास्तविक संसाधन नहीं हो सकता है और इसे व्यवसायिक तर्क द्वारा लागू किया जा सकता है जो कि दिशा-निर्देशों के आधार पर दिशा-निर्देश प्राप्त कर सकते हैं)।


यह एक बुरा उदाहरण है। इस मामले में निर्देश (सभी संभावित दिशाएं, उनमें से अनंत संख्या) संसाधन है और पैरामीटर सिर्फ फिल्टर हैं। लेकिन आप इसके साथ एक "खरीद" नहीं कर सकते हैं, क्योंकि फिल्टर केवल संचालन प्राप्त करने और ऑर्डर देने या इसे रद्द करने के लिए समझ में आता है जो डेटा को बदलने वाले ऑपरेशन हैं
Tseng

2
खरीद एक आदेश बनाया है इंगित करने के लिए शरीर में एक json के साथ POST / आदेश होगा। रद्द करने के लिए PUT / ऑर्डर के साथ एक json के साथ आदेश राज्य परिवर्तन को इंगित करने के लिए ले जाना चाहिए यह एक उदासीन अद्यतन है। मैं अभी भी एक ऑपरेशन में भाग लेने के लिए हूं, जिसे संसाधन प्रारूप में व्यक्त नहीं किया जा सकता है। तो इस तरह एक उदाहरण देखने के लिए उत्सुक होंगे
Maruthi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.