REST का उपयोग करके कई रिकॉर्ड हटाएं


96

कई वस्तुओं को हटाने का REST-ful तरीका क्या है?

मेरा उपयोग मामला यह है कि मेरे पास एक बैकबोन संग्रह है, जिसमें मुझे एक ही बार में कई आइटम हटाने में सक्षम होने की आवश्यकता है। विकल्प प्रतीत होते हैं:

  1. हर एक रिकॉर्ड के लिए एक DELETE अनुरोध भेजें (जो संभावित रूप से दर्जनों आइटम होने पर एक बुरा विचार जैसा लगता है);
  2. एक DELETE भेजें जहाँ ID हटाने के लिए URL में एक साथ स्ट्रगल किया जाता है (जैसे, "/ रिकॉर्ड / 1; 2; 3;");
  3. गैर-रीस्ट तरीके से, एक कस्टम JSON ऑब्जेक्ट भेजें, जिसमें आईडी को हटाने के लिए चिह्नित किया गया है।

सभी विकल्प आदर्श से कम हैं।

यह REST सम्मेलन के एक ग्रे क्षेत्र की तरह लगता है।


जवाबों:


90
  1. एक व्यवहार्य विकल्प है, लेकिन स्पष्ट रूप से आपके द्वारा वर्णित सीमाएं हैं।
  2. यह मत करो। इसे बिचौलियों द्वारा "DELETE एकल (एकल) संसाधन" के रूप में माना जाएगा /records/1;2;3- इसलिए इस पर 2xx की प्रतिक्रिया से उनका कैश शुद्ध हो सकता है /records/1;2;3; शुद्ध नहीं/records/1 , /records/2या /records/3; प्रॉक्सी के लिए 410 प्रतिक्रिया /records/1;2;3, या अन्य चीजें जो आपके दृष्टिकोण से कोई मतलब नहीं रखती हैं।
  3. यह विकल्प सबसे अच्छा है, और इसे आराम से किया जा सकता है। यदि आप एक एपीआई बना रहे हैं और आप संसाधनों में बड़े बदलाव की अनुमति देना चाहते हैं, तो आप इसे करने के लिए REST का उपयोग कर सकते हैं, लेकिन वास्तव में बहुतों के लिए तुरंत स्पष्ट नहीं है। एक विधि 'परिवर्तन अनुरोध' संसाधन बनाने के लिए है (जैसे किसी निकाय को पोस्ट records=[1,2,3]करके /delete-requests) और बनाया गया संसाधन ( Locationप्रतिक्रिया के शीर्षलेख द्वारा निर्दिष्ट ) का पता लगाने के लिए कि क्या आपका अनुरोध स्वीकार किया गया है, अस्वीकार कर दिया गया है, प्रगति पर है। या पूरा कर लिया है। यह लंबे समय तक चलने वाले संचालन के लिए उपयोगी है। एक अन्य तरीका सूची संसाधन के लिए एक PATCHअनुरोध भेजने के लिए है ,/recordsजिस शरीर में उन संसाधनों पर प्रदर्शन करने के लिए संसाधनों और कार्यों की एक सूची होती है (आप जिस भी प्रारूप में समर्थन करना चाहते हैं)। यह त्वरित संचालन के लिए उपयोगी है जहां अनुरोध के लिए प्रतिक्रिया कोड ऑपरेशन के परिणाम का संकेत दे सकता है।

REST की बाधाओं को ध्यान में रखते हुए सब कुछ हासिल किया जा सकता है, और आमतौर पर इसका उत्तर "समस्या" को एक संसाधन में बनाना है, और इसे एक URL देना है।
इसलिए, बैच ऑपरेशंस, जैसे कि यहां डिलीट, या एक सूची में कई आइटम्स को पोस्ट करना, या संसाधनों के स्वैथ को एक ही एडिट करना, सभी को एक "बैच ऑपरेशंस" लिस्ट बनाकर और अपने नए ऑपरेशन को पोस्ट करके इसे हैंडल किया जा सकता है।

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

REST वेब सेवाओं में बैच संचालन से निपटने के लिए पैटर्न पर इस प्रश्न के कुछ बुरे उत्तर हैं? जो अभी तक बहुत सारे अपवोट हैं, लेकिन इसे भी पढ़ा जाना चाहिए।


2
यह आपका सर्वर नहीं है जिसके बारे में आपको चिंतित होना है, यह बिचौलियों, सीडीएन, कैशिंग प्रॉक्सी, आदि है। इंटरनेट एक छंटनी प्रणाली है। यही कारण है कि यह इतनी अच्छी तरह से काम करता है। रॉय ने निर्धारित किया कि इसकी सफलता के लिए सिस्टम के कौन से पहलू आवश्यक थे, और उन्हें REST नाम दिया। यदि आप एक DELETEअनुरोध जारी करते हैं, तो अनुरोधकर्ता और सर्वर के बीच जो भी झूठ होगा, वह एक ही संसाधन को निर्दिष्ट URL पर सोचेगा, हटाया जा रहा है। क्वेरी स्ट्रिंग इन उपकरणों के URL के अपारदर्शी भाग हैं, इसलिए इससे कोई फर्क नहीं पड़ता कि आप अपने API को कैसे निर्दिष्ट करते हैं, वे इस ज्ञान के लिए निजी नहीं हैं, इसलिए अलग-अलग व्यवहार नहीं कर सकते।
निकोलस शेंक्स

3
/ रिकॉर्ड / 1, 2, 3 होगा काम नहीं आप एक बहुत संसाधनों यूआरआई लंबाई प्रतिबंधों की वजह से नष्ट करने के लिए है, तो
dukethrash

3
ध्यान दें कि यदि DELETE और एक शरीर को शुद्ध करने के लिए संसाधनों को परिभाषित करने पर विचार किया जाता है, तो हो सकता है कि कुछ मध्यस्थ शरीर को अग्रेषित न करें। इसके अलावा, कुछ HTTP क्लाइंट एक DELETE में एक निकाय नहीं जोड़ सकते हैं। देखें stackoverflow.com/questions/299628/...
ल्यूक Puplett

3
@LukePletlet मैं केवल यह कहूंगा कि एक अनुरोध के साथ एक DELETEअनुरोध निकाय को पारित करना निषिद्ध है। यह मत करो। अगर तुम करोगे तो मैं तुम्हारे बच्चों को खा जाऊंगा। Nom nom nom।
निकोलस शैंक्स

3
# 3 के तर्क के साथ समस्या यह है कि यह # 2 के खिलाफ काउंटर तर्क के रूप में एक ही जुर्माना वहन करता है। संसाधन बनाना-हटाना कुछ ऐसा नहीं है जो अपस्ट्रीम प्रॉक्सी को पता होगा कि कैसे संभालना है - वही काउंटर तर्क जो दृष्टिकोण # 2 के खिलाफ उठाया जाता है।
LB2

16

यदि GET /records?filteringCriteriaमापदंड से मेल खाते सभी रिकॉर्डों की सरणी देता है, तो DELETE /records?filteringCriteriaऐसे सभी रिकॉर्डों को हटा सकता है।

इस मामले में आपके प्रश्न का उत्तर होगा DELETE /records?id=1&id=2&id=3


1
मैं भी इस नतीजे पर पहुँचा: क्रिया को आप जो करना चाहते हैं, उसे पलटें। मुझे समझ में नहीं आता है कि GET के लिए क्या होता है DELETE के लिए नहीं जाता है।
ल्यूक पुप्लेट

9
GET /records?id=1&id=2&id=3इसका मतलब यह नहीं है कि "आईडी 1, 2 और 3 के साथ तीन रिकॉर्ड प्राप्त करें", इसका मतलब है "URL पथ / रिकॉर्ड के साथ एकल संसाधन प्राप्त करें? आईडी = 1 और आईडी = 2 और आईडी = 3" जो एक शलजम की तस्वीर हो सकती है, एक सादा पाठ दस्तावेज़ में "नंबर" चीनी में है, या मौजूद नहीं हो सकता है।
निकोलस शैंक्स

निम्नलिखित पर विचार करें: के लिए दो अनुक्रमिक अनुरोध /records?id=1और /records?id=2भेजे जाते हैं, और उनकी प्रतिक्रियाएं कुछ मध्यस्थ (जैसे आपका ब्राउज़र या आईएसपी) द्वारा कैश की जाती हैं। यदि इंटरनेट को पता था कि आपके आवेदन का क्या मतलब है, तो यह इस कारण से है कि /records?id=1&id=2मूल सर्वर से पूछे बिना दो परिणाम पहले से ही (किसी तरह) विलय करके कैश द्वारा वापस किया जा सकता है। लेकिन यह संभव नहीं है। /records?id=1&id=2अमान्य हो सकता है (अनुरोध के अनुसार केवल 1 आईडी) या पूरी तरह से अलग (एक शलजम) कुछ वापस कर सकता है।
निकोलस शैंक्स

यह एक बुनियादी संसाधन कैशिंग समस्या है। अगर मेरे डीबीए ने सीधे राज्य को उत्परिवर्तित कर दिया है, तो अब कैश सिंक से बाहर हैं। आप एक उदाहरण देते हैं 410 मध्यस्थ द्वारा लौटाया जाता है, लेकिन 410 स्थायी निष्कासन के लिए है, DELETE पर एक कैश उस URL के लिए अपना स्लॉट साफ़ कर सकता है, लेकिन यह 410 या 404 नहीं भेजेगा, क्योंकि यह नहीं जानता कि क्या डीबीए बस संसाधन को फिर से मूल पर वापस नहीं लाना चाहिए।
ल्यूक पुप्लेट

4
@ निकोलस शैंक्स मैं वास्तव में असहमत हूं। यदि परिणाम कैश हैं, तो सर्वर की गलती है। और अगर आप एपीआई के डिजाइन के बारे में बात कर रहे हैं, तो आप उम्मीद कर रहे हैं कि सर्वर के लिए कोड लिख रहा है। चाहे आप मूल्यों की एक सरणी का प्रतिनिधित्व करने के लिए id[]=1&id[]=2या id=1&id=2क्वेरी स्ट्रिंग में उपयोग करते हैं, यह क्वेरी स्ट्रिंग बस का प्रतिनिधित्व करता है। और मुझे लगता है कि क्वेरी स्ट्रिंग का प्रतिनिधित्व करने के लिए यह अत्यंत सामान्य और अच्छा अभ्यास है। इसके अलावा, यदि आप हटाने और अपडेट के लिए अनुमति देते हैं, तो GETअनुरोधों को कैश न करें । यदि आप करते हैं, तो ग्राहक बासी अवस्था धारण करेंगे।
जोसेफ नेल्स

8

मुझे लगता है कि Mozilla Storage Service SyncStorage API v1.5 REST का उपयोग करके कई रिकॉर्ड को हटाने का एक अच्छा तरीका है।

एक पूरे संग्रह को हटाता है।

DELETE https://<endpoint-url>/storage/<collection>

एक एकल अनुरोध के साथ एक संग्रह से कई बीएसओ को हटाता है।

DELETE https://<endpoint-url>/storage/<collection>?ids=<ids>

आईडी : बीएसओ को उस संग्रह से हटा देता है जिसकी आईडी प्रदान की गई अल्पविराम से अलग की गई सूची में है। अधिकतम 100 आईडी प्रदान की जा सकती हैं।

बीएसओ को दिए गए स्थान पर हटाता है।

DELETE https://<endpoint-url>/storage/<collection>/<id>

http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions


यह एक अच्छा समाधान की तरह लगता है । मुझे लगता है कि अगर मोज़िला को लगता है कि यह सही है तो यह होना चाहिए? एकमात्र प्रश्न तब त्रुटि से निपटने का है। मान लें कि वे पास हैं? आईडी = 1,2,3 और आईडी 3 मौजूद नहीं है आप 1 और 2 को हटाते हैं और फिर 200 के साथ प्रतिक्रिया करते हैं क्योंकि अनुरोधकर्ता 3 चला गया है और ऐसा नहीं है इसलिए यह कोई फर्क नहीं पड़ता? या क्या होगा अगर वे 1 को हटाने के लिए अधिकृत हैं, लेकिन 2 नहीं ... क्या आप कुछ भी नहीं हटाते हैं और एक त्रुटि के साथ प्रतिक्रिया करते हैं या क्या आप दूसरों को छोड़ सकते हैं और क्या छोड़ सकते हैं ...
tempcke

मैं आम तौर पर एक सफल प्रतिक्रिया लौटाऊंगा क्योंकि अंत स्थिति एक समान है। यह क्लाइंट पर तर्क को सरल बनाता है और साथ ही उन्हें अब उस त्रुटि स्थिति को संभालने की आवश्यकता नहीं है। प्राधिकरण मामले के लिए, मैं बस पूरे अनुरोध को विफल कर दूंगा ... लेकिन वास्तव में यह आपके उपयोग के मामले पर निर्भर करता है।
नाथन फेटेप्लेट

3

यह REST सम्मेलन के एक ग्रे क्षेत्र की तरह लगता है।

हां, अब तक मैं केवल एक ही REST API डिज़ाइन गाइड के लिए आया हूं जिसमें बैच ऑपरेशन (जैसे कि बैच डिलीट) का उल्लेख है: google api design guide

इस गाइड में "कस्टम" विधियों के निर्माण का उल्लेख किया गया है, जो एक बृहदान्त्र का उपयोग करके संसाधन के माध्यम से जुड़ा जा सकता है, उदाहरण के लिए https://service.name/v1/some/resource/name:customVerb, यह स्पष्ट रूप से उपयोग के मामले के रूप में बैच संचालन का उल्लेख करता है:

एक कस्टम विधि एक संसाधन, एक संग्रह या एक सेवा से जुड़ी हो सकती है। यह एक मनमाना अनुरोध ले सकता है और एक मनमाना प्रतिक्रिया वापस कर सकता है, और स्ट्रीमिंग अनुरोध और प्रतिक्रिया का भी समर्थन करता है। [...] कस्टम विधियों को HTTP POST क्रिया का उपयोग करना चाहिए क्योंकि इसमें सबसे लचीला शब्दार्थ है [...] प्रदर्शन के महत्वपूर्ण तरीकों के लिए, ओवर-रिक्वेस्ट को कम करने के लिए कस्टम बैच विधि प्रदान करना उपयोगी हो सकता है ।

तो आप गूगल के एपीआई गाइड के अनुसार निम्नलिखित कर सकते हैं:

POST /api/path/to/your/collection:batchDelete

... अपने संग्रह संसाधन की वस्तुओं का एक गुच्छा हटाने के लिए।


एक व्यवहार्य समाधान है कि आइटम की सूची एक JSON स्वरूपित सरणी के माध्यम से संचारित है?
डेनियल

हाँ यकीनन। आप एक पेलोड को पोस्ट कर सकते हैं जिसमें आईडी को एक json सरणी के माध्यम से भेजा जाता है।
14:12 बजे B12Toaster

यह दिलचस्प है कि Google API गाइड ने If the HTTP verb used for the custom method does not accept an HTTP request body (GET, DELETE), the HTTP configuration of such method must not use the body clause at all,कस्टम विधि अध्याय में कहा है । लेकिन GET accounts.locations.batchGetएपीआई शरीर के साथ जीईटी विधि है। यह अजीब है। developers.google.com/my-business/reference/rest/v4/...
鄭元傑

@ Sight सहमत हैं, पहली नजर में थोड़ा अजीब लगता है लेकिन अगर आप बारीकी से देखें तो यह वास्तव में एक POSThttp विधि का उपयोग किया गया है और केवल कस्टम विधि का नाम है batchGet। मुझे लगता है कि Google अपने नियम से (ए) छड़ी करता है कि सभी कस्टम तरीकों को POST(मेरे उत्तर देखें) और (बी) को लोगों के लिए शरीर में "फ़िल्टर" डालना आसान बनाने की आवश्यकता है ताकि आपको ऐसा न करना पड़े क्वेरी स्ट्रिंग्स के साथ फ़िल्टर से बच जाएं या एनकोड करें। नकारात्मक रूप से, निश्चित रूप से, यह वास्तव में अब उपलब्ध नहीं है ...
B12Toaster

https://service.name/v1/some/resource/name:customVerbपरिभाषा से Restful नहीं है।
बहमन

2

मैंने एक संग्रह के एक थोक प्रतिस्थापन के लिए अनुमति दी है, जैसे PUT ~/people/123/shoes जहां शरीर पूरे संग्रह का प्रतिनिधित्व करता है।

यह उन आइटमों के छोटे बच्चे के संग्रह के लिए काम करता है, जहाँ ग्राहक किसी आइटम की समीक्षा करना चाहते हैं और कुछ को प्री-आउट करते हैं और कुछ अन्य को जोड़ते हैं और फिर सर्वर को अपडेट करते हैं। वे सभी को हटाने के लिए एक खाली संग्रह PUT कर सकते थे।

इसका मतलब यह होगा कि GET ~/people/123/shoes/9अभी भी कैश में रहेगा, लेकिन एक PUT ने इसे हटा दिया, लेकिन यह सिर्फ एक कैशिंग मुद्दा है और अगर किसी अन्य व्यक्ति ने जूता हटा दिया तो यह एक समस्या होगी।

मेरे डेटा / सिस्टम API हमेशा एक्सपायरी समय के विपरीत ETags का उपयोग करते हैं ताकि सर्वर प्रत्येक अनुरोध पर हिट हो, और मुझे डेटा को म्यूट करने के लिए सही संस्करण / संगामिति हेडर की आवश्यकता होती है। एपीआई जो केवल-पढ़ने के लिए और दृश्य / रिपोर्ट संरेखित हैं, के लिए मैं मूल पर हिट को कम करने के लिए समाप्ति समय का उपयोग करता हूं, जैसे कि एक लीडरबोर्ड 10 मिनट के लिए अच्छा हो सकता है।

बहुत बड़े संग्रह के लिए, जैसे ~/people, मुझे कई हटाने की आवश्यकता नहीं है, उपयोग-मामला स्वाभाविक रूप से उत्पन्न नहीं होता है और इसलिए एकल DELETE ठीक काम करता है।

भविष्य में, और REST एपीआई के निर्माण के साथ अनुभव से और ऑडिट की तरह ही मुद्दों और आवश्यकताओं को मारते हुए, मैं केवल GET और POST क्रियाओं का उपयोग करना और घटनाओं के आसपास डिजाइन करना चाहूंगा, उदाहरण के लिए POST पता बदलने की घटना, हालांकि मुझे संदेह है समस्याओं का अपना सेट के साथ आ जाएगा :)

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


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

Haha। यह वास्तव में एक पैटर्न बन गया है! फ्रंट-एंड के लिए बैकेंड यह थॉटवर्क्स टेक्नोलॉजी रडार पर कहा जाता है। यह अधिक एप्लिकेशन लॉजिक को भी लिखने की अनुमति देता है जो कि कहने में बोझिल होगा, जावास्क्रिप्ट, और स्पष्ट रूप से एक क्लाइंट के बिना अपडेट किया जा सकता है इसलिए एक आईओएस ऐप के लिए अपडेट का कहना है।
ल्यूक पुप्लेट

Google की पहली चार हिट्स को स्किम-रीड करना, ऐसा लगता है कि यह BFF तकनीक केवल तभी काम कर सकती है जब क्लाइंट आपके नियंत्रण में हों । क्लाइंट डेवलपर्स अपनी इच्छानुसार एपीआई का विकास करते हैं, जो कि माइक्रोसॉफ़्ट एपीआई की कॉल को मैप करते हैं जो वास्तविक बैक एंड हैं। इस आरेख में: samnewman.io/patterns/ RGBectural / bff / #bff मैं BFF बॉक्स के नीचे "परिधि" पंक्ति रखूंगा - प्रत्येक बॉक्स केवल क्लाइंट का हिस्सा है। यह डेटा सेंटर के बाहर भी रह सकता है। मैं यह भी नहीं देखता कि REST दोनों इंटरफेस (क्लाइंट / BFF और BFF / microservice) पर कैसे लागू नहीं होता है।
निकोलस शैंक्स

1
हाँ यह एक अच्छी बात है। यह आम तौर पर तब होता है जब आपके पास एक टीम बनाने वाली माइक्रोसॉर्फ़िस और एक कोणीय ऐप बनाने वाली टीम होती है, उदाहरण के लिए, और वह देव टीम अधिक फ्रंट-एंड प्रकार की होती है, जिन्हें छोटी शुद्धतावादी सेवाओं के एक समूह के खिलाफ काम करना पसंद नहीं होता है। हालाँकि, मुझे ऐसा कोई कारण नहीं दिखाई देता है कि आप अपने ग्राहकों के लिए माइक्रोसेरेब्रिटी और एग्रीगेशन के लिए एक ही पैटर्न का उपयोग नहीं कर सकते हैं, लेकिन इस तरह से माइक्रोसर्विस को फेशियल को प्रभावित किए बिना बदला जा सकता है।
ल्यूक पुप्लेट

एक एपीआई एंडपॉइंट को डोमेन और व्यवसाय की जरूरतों को मॉडल करना चाहिए। उन समस्याओं को हल करने के लिए कोड और सख्त और कई समय के अनम्य चश्मे का पालन करने के लिए ओवर-इंजीनियरिंग से बचें। REST वैसे भी दिशा-निर्देशों के अलावा कुछ नहीं है।
विक्टोरियो बेर्रा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.