क्या PUT या DELETE के साथ किसी संग्रह को आंशिक रूप से बदलना ठीक है?


21

मेरे पास उत्पाद समूह में उत्पादों का एक संग्रह है जैसे:

product-groups/123/products
  1. यदि मुझे संग्रह में जोड़ने की आवश्यकता है , तो क्या यह ठीक है कि मैं केवल कुछ उत्पादों को PUT के साथ पास करूं?

  2. अगर मुझे संग्रह से कुछ उत्पादों को हटाने की आवश्यकता है , तो क्या यह ठीक है कि मैं DELETE के साथ फ़िल्टर डेटा (आईडी की एक सरणी) पास करता हूं ?

ReST की भावना में कार्यक्षमता को लागू करने का सबसे अच्छा तरीका क्या है?

संपादित करें: आइटम अलग-अलग संस्थाओं के लिंक हैं, मूल रूप से उत्पादों के आईडी।


क्या उत्पाद समूह में अलग-अलग संसाधनों वाले आइटम कहीं और प्रबंधित किए जाते हैं? या वे केवल उत्पाद समूह संग्रह का हिस्सा हैं? यदि अलग है, तो क्या उत्पाद कई उत्पाद समूहों से संबंधित हो सकते हैं?
Martijn Pieters

2
शायद PATCH यह विनिर्देश नई HTTP / 1.1 [RFC2616] विधि, PATCH को परिभाषित करता है, जिसका उपयोग संसाधन में आंशिक संशोधन लागू करने के लिए किया जाता है।
एसाइलिजा

एक उत्पाद (आईडी) कई उत्पाद समूहों से संबंधित हो सकता है।
user151851

क्या कहने के लिए एक प्रसिद्ध तरीका (सर्वोत्तम अभ्यास) है कि कैसे संग्रह में उत्पादों को जोड़ें या हटाएं?
user151851

जवाबों:


10

सामान्य तौर पर आपके पास एक समापन बिंदु होता है जो x के पूरे संग्रह का प्रतिनिधित्व करता है :

/products

कहते हैं, आप किसी एकल उत्पाद को अद्यतन करना चाहते हैं, आप एक PUT करना चाहते हैं /products/{id}। यदि आप किसी एक उत्पाद को आंशिक रूप से अपडेट करना चाहते हैं (हर क्षेत्र को अपडेट नहीं कर रहे हैं), तो आप PATCH to का भी उपयोग कर सकते हैं /products/{id}। वही एकल इकाई ( DELETE/products/{id} ) को हटाने के लिए जाता है ।

यदि आप किसी एकल स्रोत को लक्षित करना चाहते हैं , तो आप पथ के माध्यम से अर्हता प्राप्त करते हैं, आप किस एकल स्रोत को संशोधित करना चाहते हैं।

इस योजना को तोड़ने वाली एकमात्र कार्रवाई एक रेसर का निर्माण है। जब एक ressource आप एक पूरे के रूप संग्रह को लक्ष्य बनाने का कहना है कि पोस्ट करने के लिए /products

उस ने कहा, यह स्पष्ट होना चाहिए, कि एक पूरे के रूप में संग्रह को प्रभावित करने वाले संचालन के लिए लक्ष्य, उपयुक्त संग्रह-समापन बिंदु पर जाना चाहिए।

उदाहरण के लिए, आप लाल रंग के उत्पादों के एक सबसेट को पुनः प्राप्त करना चाहते हैं, आप इसके लिए पूछते हैं

प्राप्त करने के लिए /products?colour=red

इसलिए, यदि आप इन सभी को हटाना चाहते हैं, तो आप DELETE करते हैं /products?colour=red । या यदि आप कुछ उत्पादों को हटाना चाहते हैं id, तो आप DELETE कर सकते हैं /products?id=1&id=2&id=3

सूत्रों के थोक निर्माण के बारे में क्या ? बस अपने संग्रह को पोस्ट करें । वही PUT और PATCH के लिए जाता है ।[{...},{...},{...}]/products

यह वास्तव में सीधा है।

अपने सवालों के जवाब देने के लिए:

यदि मुझे संग्रह में जोड़ने की आवश्यकता है, तो क्या यह ठीक है कि मैं केवल कुछ उत्पादों को PUT के साथ पास करूं?

यह केवल ओके नहीं है, आपको इसे वैसा करने के लिए प्रोत्साहित किया जाता है।

अगर मुझे संग्रह से कुछ उत्पादों को हटाने की आवश्यकता है, तो क्या यह ठीक है कि मैं DELETE के साथ फ़िल्टर डेटा (आईडी की एक सरणी) पास करता हूं?

यह ठीक है। जैसा कि एन्नेको अलोंसो ने लिखा है, कभी-कभी "नियंत्रक" -प्रोप्वाइंट्स के माध्यम से इनकैप्सुलेट किए गए बल्कऑपरेशन होते हैं , अर्थात एक POST का उपयोग ट्रिगर (जटिल) संचालन के लिए किया जाता है।


2
PUT एक बदला हुआ ऑपरेशन है। "कुछ उत्पादों" के साथ संग्रह एंडपॉइंट पर PUT को कॉल करना चाहिए (किसी उत्पाद को "कुछ उत्पादों" की सूची में शामिल नहीं करने वाले ओपी के मामले में, रिश्ते को हटा दें)। जबकि इसका उपयोग वस्तुओं को जोड़ने के लिए किया जा सकता है, यह उन वस्तुओं को भी हटा देना चाहिए जो (मेरी राय में) ओपी को उम्मीद नहीं है। आपको अपने पहले प्रश्न के अनुसार अपनी प्रतिक्रिया को संशोधित करना चाहिए।
क्लेटनटैंड

@ क्लैटटॉन्ड: मुझे लगता है कि उत्तर ठीक है, जब तक कि एक आंशिक अद्यतन के साथ PATCH, और एक पूर्ण प्रतिस्थापन, के माध्यम से किया जाता है PUT
9000

4
@ 9000। बेशक, लेकिन जवाब वर्तमान में कहता है "आप को प्रोत्साहित किया जाता है ... संग्रह में जोड़ें ... [द्वारा] पास [आईएनजी] केवल कुछ उत्पादों के साथ"। यह निश्चित रूप से गलत है। POST के लिए प्रोत्साहित किया। PUT करने में सक्षम ... लेकिन केवल सभी (कुछ नहीं) आइटम पास करके।
क्लेटनटैंड

5

आमतौर पर, REST विधियों को एक इकाई / वस्तु (CRUD) पर संचालित करने का इरादा है।

कई विकल्प हैं:

  • अपने संग्रह को संस्थाओं के रूप में मानें और उन्हें POST के माध्यम से अपडेट करें
  • वैकल्पिक, गैर-आरईएसटी संचालन बनाएं

पहले वाला REST मानकों का पालन करता है, लेकिन यह महंगा हो सकता है, क्योंकि आपके संग्रह की वस्तुएं / संस्थाएं बहुत बड़ी हो सकती हैं (एक समूह को अपडेट करने के लिए जिसमें एक उत्पाद जोड़ने के लिए हजारों उत्पाद हैं / एक भारी अनुरोध होगा)।

दूसरा विकल्प कई एपीआई द्वारा पसंद किया जाता है, सीआरयूडी परिचालन से परे आरईएसटी का विस्तार करने के तरीके के रूप में।

उदाहरण के लिए:

GET product-groups/123/products (list all the products in the group)
POST product-groups/123/products/append (POST a list of new product ids to append to the group)
POST product-groups/123/products/remove (POST a list of product ids to remove from the group)

कई एपीआई इस विस्तारित संचालन के लिए हमेशा POST का उपयोग करते हैं, लेकिन कुछ अन्य http तरीकों का उपयोग करने के लिए आपको सीमित नहीं करता है (खाली शरीर रखने के लिए GET और DELETE की सीमा के अलावा)


निश्चित रूप से, लक्ष्य तक पहुँचने के लिए कुछ तरीके हैं। सबसे अच्छा अभ्यास कौन सा है? कौन सा भविष्य में अधिक प्रूफ होगा?
user151851

4
@ user151851: कुल REST अनुपालन (यदि ऐसी कोई बात है) एक उदात्त लक्ष्य है। यहां दृष्टिकोण की रूपरेखा अधिक यथार्थवादी प्रतीत होती है, क्योंकि यह वास्तव में "वास्तविक दुनिया" में उपयोग किया जा रहा है, इसे संक्षेप में, एक डिफैक्टो-मानक के रूप में उपयोग करने का प्रयास करने का प्रयास है। के बारे में भविष्य के सबूत के रूप में आप प्राप्त करने जा रहे हैं।
रॉबर्ट हार्वे

2
क्या हम URL में "एपेंड" और "डिलीट" का उपयोग करके कस्टम क्रियाओं का परिचय नहीं देते हैं? इस तरह से हमें यह बताना होगा कि एपीआई का उपयोग कैसे किया जाता है। क्या हमें पुन: उपयोग नहीं करना चाहिए जो हमारे पास है यानी HTTP तरीके? किस मामले में कार्रवाई अच्छी तरह से जाना जाता है।
user151851

7
किसी और के लिए जो इस उत्तर में होता है: यह गलत है। जैसा कि @ user151851 ने उल्लेख किया है, यह URL में क्रियाओं का परिचय देता है जो लगभग गैर-रिस्टफुल के रूप में है जैसा कि आप प्राप्त कर सकते हैं। वास्तविक प्रश्न के संबंध में, मेरे पास एक महान उत्तर नहीं है, लेकिन यह एक नहीं है।
umbrae

क्या "विस्तार" को अधिक संसाधन-उन्मुख बनाया जा सकता है, products/collectionजो वस्तुओं का 'लिफाफा' लौटाता है और लिफाफे की सामग्री एक PUT के माध्यम से बदल जाती है? जैसे, "यहाँ पर बताया गया है कि कैसे मैं संग्रह में मौजूद वस्तुओं को चाहता हूँ"।
ल्यूक पुप्लेट

3

बस पिछले जवाब / टिप्पणियों को सटीक करने के लिए।

मेरे ज्ञान के अनुसार, POST संग्रह में एकल तत्वों को जोड़ने की विधि है।

बदले में DELETE, एकल तत्व को संग्रह से हटाने की विधि है। दोनों परिदृश्य पूरी तरह से RESTful हैं।

हालाँकि, आपको एकल तत्व या संपूर्ण संग्रह को संदर्भित करने के लिए उपयुक्त URI का उपयोग करना चाहिए।

उदाहरण के लिए, संग्रह करने के लिए तत्व जोड़ने के लिए आपको URI का अनुसरण करने के लिए POST डेटा चाहिए:

https://www.factory.net/products/

संग्रह से एकल उत्पाद को हटाने के लिए, आप DELETE पद्धति का उपयोग कुछ इस तरह के अनुरोध भेजने के लिए कर सकते हैं:

https://www.factory.net/products/108/

PATCH विधि का उपयोग संग्रह के भीतर कुछ तत्वों को अद्यतन करने के लिए किया जा सकता है। उदाहरण के लिए, जब आपको केवल एक तत्व में एक फ़ील्ड अपडेट करने की आवश्यकता होती है। बहुत बड़े संग्रह के लिए पूर्ण संसाधन प्रतिनिधित्व को प्रस्तुत करना बहुत महंगा ऑपरेशन हो सकता है।


2

सिद्धांत रूप में, सभी संग्रहण कार्य किसी संग्रह पर मान्य होते हैं, लेकिन सुनिश्चित करें कि आप समझते हैं कि क्रियाओं का शब्दार्थ एक संग्रह पर कैसे लागू होता है:

  • PUT एक पूर्ण प्रतिस्थापन है।

    • यदि आप एक सिंगलटन (जैसे /item/{id}) से nameबाहर निकलते हैं और बाहर निकलते हैं, तो इसे साफ़ किया जाना चाहिए या कुछ समान या शून्य करना चाहिए।
    • यदि आप किसी संग्रह में जाते हैं और किसी आइटम को शामिल नहीं करते हैं, तो उसे उस संग्रह से निकाल दिया जाना चाहिए ।

    जबकि आइटम जोड़ने के लिए एक PUT का उपयोग किया जा सकता है, आपको "सभी" आइटम भेजना होगा। "कुछ" आइटम भेजने से निष्कासन में परिणाम होना चाहिए (मुझे लगता है कि यह ओपी की इच्छा नहीं है)।

  • DELETE अधिक सहज है। यह संग्रह या किसी भी फ़िल्टर किए गए सबसेट को हटाने के लिए मान्य है। केवल फ़िल्टर में शामिल आइटम प्रभावित होना चाहिए।

  • PATCH भी मान्य है। सिद्धांत रूप में, आपको "ऑपरेशन" की एक सूची प्रदान करनी चाहिए। उदाहरण के लिए, आपको तकनीकी रूप से कुछ भेजना चाहिए जैसे:

    [{ 
        "action": "update",
        "id": <id>,
        "value": {...}
    },{
        "action": "add",
        "value": {...}
    }, ...]
    

    व्यवहार में, यह एक एपीआई देखने के लिए अधिक सामान्य है जो उन वस्तुओं की एक आंशिक सूची को स्वीकार करता है जहां प्रत्येक आइटम को एक यूपीएसईआरटी (अद्यतन) या तर्क का उपयोग करके संसाधित किया जाता है।

  • तकनीकी रूप से, POST को इनपुट को "संसाधन के अपने विशिष्ट शब्दार्थ के अनुसार" संसाधित करना चाहिए।

    • व्यवहार में, POST का उपयोग आम तौर पर "बनाने" के लिए किया जाता है।
    • हालाँकि, POST गैर-मानक कॉल के लिए उपयोग की जाने वाली क्रिया भी है। हालांकि यह जोरदार बहस है कि क्या एक्शन एंडपॉइंट्स सख्ती से रिस्टफुल हैं (मैं "नहीं" एस के साथ हूं), पोस्टस्ट एक उपयुक्त क्रिया है यदि आप एंडपॉइंट की तरह एक अनुरोध सबमिट कर रहे थे {resource}/activate

ध्यान दें: संग्रह पर गैर-जीईटी संचालन का उपयोग करते समय, ध्यान से सफलता और विफलता की परिभाषा पर विचार करें। REST आपको आंशिक सफलता का संचार करने का एक अच्छा तरीका नहीं देता है। एक अच्छा डिफ़ॉल्ट यह मान लेना है कि आप सभी या कुछ भी सफलता के मापदंड के साथ लेनदेन में ऑपरेशन चलाएंगे। यदि यह वह नहीं है जो आप चाहते हैं, तो शायद आपको सीधे संग्रह के साथ बातचीत नहीं करनी चाहिए।

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