एक अनुरोध में कई आइटम्स बनाने का सबसे अच्छा तरीका


122

मैं आदेशों को इकट्ठा करने के लिए एक छोटे ग्राहक सर्वर कार्यक्रम पर काम कर रहा हूं। मैं इसे "रीस्ट (फुल) तरीके" से करना चाहता हूं।

मुझे क्या करना है:

सभी ऑर्डरलाइन (उत्पाद और मात्रा) एकत्र करें और सर्वर को पूरा ऑर्डर भेजें

फिलहाल मुझे ऐसा करने के लिए दो विकल्प दिखाई देते हैं:

  1. सर्वर को प्रत्येक ऑर्डरलाइन भेजें: POST Qty और product_id

मैं वास्तव में ऐसा नहीं करना चाहता क्योंकि मैं सर्वर के लिए अनुरोधों की संख्या को सीमित करना चाहता हूं इसलिए विकल्प 2:

  1. सभी ऑर्डरलाइन एकत्र करें और उन्हें एक ही बार में सर्वर पर भेजें।

मुझे विकल्प 2 कैसे लागू करना चाहिए? मेरे पास कुछ विचार हैं: JSON ऑब्जेक्ट में सभी ऑर्डरलाइन लपेटें और इसे सर्वर पर भेजें या ऑर्डरलाइन पोस्ट करने के लिए एक सरणी का उपयोग करें।

क्या यह विकल्प 2 को लागू करने के लिए एक अच्छा विचार या अच्छा अभ्यास है, और यदि ऐसा है तो मुझे यह कैसे करना चाहिए।

अच्छा अभ्यास क्या है?

rest  post 

जवाबों:


74

मेरा मानना ​​है कि इससे संपर्क करने का एक और सही तरीका एक और संसाधन बनाना होगा जो आपके संसाधनों के संग्रह का प्रतिनिधित्व करता है। उदाहरण, कल्पना करें कि हमारे पास एक समापन बिंदु है जैसे/api/sheep/{id} और हम /api/sheepएक भेड़ संसाधन बनाने के लिए POST कर सकते हैं।

अब, यदि हम थोक निर्माण का समर्थन करना चाहते हैं, तो हमें एक नए झुंड संसाधन पर विचार करना चाहिए /api/flock(या /api/<your-resource>-collectionयदि आपके पास एक बेहतर सार्थक नाम की कमी है)। उसे याद रखो संसाधनों को आपके डेटाबेस या ऐप मॉडल में मैप करने की आवश्यकता नहीं है । यह एक आम धारणा है।

संसाधन एक उच्च स्तरीय प्रतिनिधित्व हैं, जो आपके डेटा से असंबंधित हैं। किसी संसाधन पर काम करने से महत्वपूर्ण दुष्प्रभाव हो सकते हैं, जैसे किसी उपयोगकर्ता को चेतावनी देना, अन्य संबंधित डेटा को अपडेट करना, एक लंबी प्रक्रिया शुरू करना, आदि। उदाहरण के लिए, हम एक फ़ाइल सिस्टम या यहां तक ​​कि यूनिक्स को मैप कर सकते हैं।ps कमांड को REST API के रूप में ।

मुझे लगता है कि यह मान लेना सुरक्षित है कि एक संसाधन को संचालित करने का मतलब साइड इफेक्ट के रूप में कई अन्य संस्थाओं को बनाना भी हो सकता है।


मैं इससे सहमत हूं। आपको अपने संसाधन के संग्रह की अवधारणा को समाप्त करना चाहिए और उस संसाधन की तरह व्यवहार करना चाहिए। यह आपको भविष्य में और अधिक लचीलापन देगा, जब आप इस पर परिचालन करना शुरू करना चाहते हैं
villy393

यह सही तरीका है। यह POST संग्रह अनुरोध को नहीं तोड़ता है। चूंकि, इसका उपयोग एकल इकाई को पोस्ट करने के लिए किया जाता है। "अलग थोक इकाई" के साथ एक थोक अनुरोध भेजना सही दृष्टिकोण है।
सॉर्टर

2
मुझे आप जैसे भेड़ और झुंड के साथ इतना नामकरण करना चाहिए! अमूर्तता की डिग्री के साथ इसका लगभग एक बाइबिल संदर्भ है: "मेरे पास अन्य भेड़ें हैं, जो इस तह की नहीं हैं। मुझे उन्हें भी लाना होगा, और वे मेरी आवाज सुनेंगे; और वे एक चरवाहे के साथ एक झुंड बन जाएंगे।" यूह 10:16।
एव्जेनी

1
दिलचस्प बात यह है कि जब आप एक एकल संसाधन बनाना चाहते हैं, तो लोग URL में बहुवचन फॉर्म (संग्रह का) का उपयोग करने की सलाह देते हैं, जैसे: एक POST / api / किताबों को एक पुस्तक बनाने के लिए भेजें। लेकिन तब जब आप 100 पुस्तकें बनाना चाहते हैं (एक ही अनुरोध में json के रूप में), आप किस URL को 100 पुस्तकों का संग्रह पोस्ट करेंगे? यहीं से बेचैनी शुरू होती है।
कोड 4kix

@ code4kix आप उपयोग कर सकते हैं /api/book-group, /api/book-collectionया कुछ इसी तरह।
माइगेलकोबैन

46

यद्यपि कई प्रणालियों में बल्क ऑपरेशन (जैसे बैच क्रिएट) आवश्यक हैं, फिर भी वे औपचारिक रूप से Restful वास्तुकला शैली द्वारा संबोधित नहीं किए जाते हैं।

मैंने पाया कि जब आप मूल रूप से काम करते हैं, तो एक संग्रह पोस्ट करना, लेकिन समस्याएँ तब पैदा होती हैं जब आपको इस तरह के अनुरोध के जवाब में विफलताओं की रिपोर्ट करने की आवश्यकता होती है। ऐसी समस्याएं तब बदतर होती हैं जब विभिन्न कारणों से कई विफलताएं होती हैं या जब सर्वर लेनदेन का समर्थन नहीं करता है। मेरा सुझाव है कि यदि कोई प्रदर्शन समस्या नहीं है, उदाहरण के लिए जब सेवा प्रदाता LAN (WAN नहीं) पर है या डेटा अपेक्षाकृत छोटा है, तो सर्वर पर 100 POST अनुरोध भेजने के लिए इसके लायक है। इसे सरल रखें, अलग-अलग अनुरोधों के साथ शुरू करें और यदि आपके पास प्रदर्शन समस्या है, तो अनुकूलन का प्रयास करें।


3
क्या आपने बैचिंग के मामले में त्रुटियों के लिए अपने आप को एक समाधान पाया? एक बुरे विचार की तरह एक पृष्ठ सीम दिखाने के लिए 100 पोस्ट अनुरोध भेजने वाले मोबाइल कनेक्शन पर।
थॉमस अहले

मैं त्रुटियों को एक सरणी में जोड़ता हूं, उपयोगकर्ता को 419 संघर्ष त्रुटि पृष्ठ पर ले जाता हूं (और उस त्रुटि को ग्राहक को लौटाता हूं), और त्रुटियों की सरणी प्रदर्शित करता हूं। अधिक जानकारी के लिए नीचे मेरा जवाब देखें।
एरिक फुलर

5
यह बकवास है। सवाल कई मदों के लिए एक आदेश भेजने के बारे में है, जो कि कई ने कहा है, आप केवल एक POST अनुरोध की इकाई में कर सकते हैं। सर्वर कैसे संभालता है यह पूरी तरह से एक और बात है। इस मामले में, मुझे एक आदेश बनाने में कोई समस्या नहीं दिखती है, आप उस आदेश के लिए क्या कर सकते हैं, और उस विवरण को भी आबाद कर सकते हैं, जो नहीं किया जा सकता है। इस तरह एक उपयोगकर्ता तब उनके आदेश को देख सकता है, और देख सकता है कि सभी लेकिन एन आइटम को ऑर्डर में जोड़ दिया गया था, लेकिन कुछ स्टॉक से बाहर थे, या सिस्टम को यह नहीं पता था कि क्या करना है। एक और सरल लेकिन कम उपयोगकर्ता के अनुकूल विकल्प सब कुछ को अस्वीकार करना है
thecoshman

2
@ कोषाध्यक्ष ने 3.25 वर्षों में बहुत कुछ बदल दिया। आपको सवाल का पूरी तरह से तैयार उत्तर देना चाहिए।
dlamblin

3
@dlamblin हाँ, मुझे शायद बहुत कुछ करना चाहिए ... मैं इसे किसी न किसी स्तर पर प्राप्त करूँगा ...
Thecoshman

9

फेसबुक यह बताता है कि यह कैसे किया जाए: https://developers.facebook.com/docs/graph-api/making-multiple-requests

साधारण बैचेड अनुरोध

बैच एपीआई तार्किक HTTP अनुरोधों की एक सरणी में ले जाता है जिसे JSON सरणियों के रूप में दर्शाया गया है - प्रत्येक अनुरोध में एक विधि है (HTTP पद्धति GET / PUT / POST / DELETE आदि के अनुसार), एक रिश्तेदार_url (ग्राफ-facebook के बाद URL का भाग)। com), वैकल्पिक हेडर सरणी (HTTP हेडर के अनुरूप) और एक वैकल्पिक निकाय (POST और PUT अनुरोधों के लिए)। बैच एपीआई JSON सरणियों के रूप में प्रतिनिधित्व तार्किक HTTP प्रतिक्रियाओं की एक सरणी देता है - प्रत्येक प्रतिक्रिया में एक स्थिति कोड, एक वैकल्पिक हेडर सरणी और एक वैकल्पिक निकाय है (जो कि JSON एन्कोडेड स्ट्रिंग है)।


1
यह बहुत ही रोचक कड़ी है, प्रस्तावित समाधान मेरे लिए उपयोगी लगता है। वैसे भी, StackOverflow में पसंदीदा उत्तर एक जवाब के शरीर में समाधान की अवधारणा को समझा रहा है क्योंकि लिंक बदल सकते हैं या गायब हो सकते हैं।
Jan Vlcinsky

7
यह वास्तव में फेसबुक का ऐसा करने का तरीका है, जरूरी नहीं कि जैसा कि ओपी ने पूछा हो
0cd

मुझे लगता है कि एक बैच एपीआई (Google, फेसबुक आदि से - @PuneetArora) कई असंबंधित अनुरोधों को एक साथ समूहीकृत करते समय अधिक उपयोगी है। एक अनुरोध बनाना जो एक आइटम बनाता है, और फिर आइटमों का एक संग्रह भेजने के लिए उन सभी अनुरोधों को एक साथ जोड़ना "पागलपन" (आइंस्टीन) है। बस एक अनुरोध बनाएं जो आइटमों का एक संग्रह पास करता है।
tfmontague

8

आपका विचार मुझे मान्य लगता है। कार्यान्वयन आपकी प्राथमिकता का विषय है। आप इसके लिए JSON या केवल मापदंडों का उपयोग कर सकते हैं ("order_lines []" सरणी) और करते हैं

POST /orders

चूँकि आप एक ही क्रिया (क्रम और उसकी पंक्तियों) में एक ही बार में अधिक संसाधन बनाने जा रहे हैं, इसलिए यह महत्वपूर्ण है कि उनमें से प्रत्येक को मान्य किया जाए और उन्हें तभी बचाया जाए जब वे सभी सत्यापन पास कर दें। आपको इसे लेनदेन में करना चाहिए।


6

मुझे लगता है कि एकल कनेक्शन के भीतर अलग-अलग अनुरोध भेजना बेहतर है । बेशक, आपके वेब-सर्वर को इसका समर्थन करना चाहिए


5

मैं वास्तव में इस समय के साथ कुश्ती कर रहा हूँ, और यहाँ मैं जो काम कर रहा हूँ।

यदि एक POST जो कई संसाधनों को जोड़ता है, वह सफल होता है, 200 ओके वापस करें (मैं 201 पर विचार कर रहा था, लेकिन उपयोगकर्ता अंततः एक संसाधन पर नहीं उतरता है जो बनाया गया था) एक पेज के साथ सभी संसाधनों को प्रदर्शित करता है जो या तो पढ़े गए थे -सुंदर या संपादन योग्य फैशन। उदाहरण के लिए, एक उपयोगकर्ता केवल एक एकल फ़ाइल इनपुट वाले फ़ॉर्म का उपयोग करके गैलरी में कई छवियों का चयन और पोस्ट करने में सक्षम है। यदि POST अनुरोध अपनी संपूर्णता में सफल होता है, तो उपयोगकर्ता को प्रत्येक छवि संसाधन प्रतिनिधित्व के लिए प्रपत्रों के एक सेट के साथ प्रस्तुत किया जाता है जो उन्हें प्रत्येक (नाम, विवरण, आदि) के बारे में अधिक विवरण निर्दिष्ट करने की अनुमति देता है।

इस घटना में कि एक या एक से अधिक संसाधन बनने में विफल हो जाते हैं, POST हैंडलर सभी प्रोसेसिंग को निरस्त कर देता है और प्रत्येक व्यक्तिगत त्रुटि संदेश को एक सरणी में जोड़ देता है। फिर, एक 419 संघर्ष लौटाया जाता है और उपयोगकर्ता को 419 संघर्ष त्रुटि पृष्ठ पर रूट किया जाता है जो त्रुटि सरणी की सामग्री को प्रस्तुत करता है, साथ ही फॉर्म को वापस सबमिट किया जाता है।


-2

आप 100 हेडलाइन के लिए HTTP हेडर नहीं भेजना चाहेंगे। आप न तो आवश्यकता से अधिक अनुरोध उत्पन्न करना चाहते हैं।

पूरे ऑर्डर को एक JSON ऑब्जेक्ट में सर्वर पर भेजें: सर्वर / ऑर्डर या सर्वर / ऑर्डर / नया। कुछ ऐसा लौटाएं जो इंगित करता है: सर्वर / ऑर्डर / ऑर्डर_ड

POST के बजाय CREATE PUT का उपयोग करने पर भी विचार करें


मुझे लगता है कि वह HTTP POST विधि का उल्लेख करता है। क्रिएट HTTP मेथड जैसी कोई चीज नहीं है।
२०:

वहाँ नहीं है? ओह रुको, वहाँ नहीं थे। इसके बदले PUT थे।
Cheery

22
पृथ्वी पर आप सामग्री बनाने के लिए PUT का उपयोग क्यों करेंगे? यह वही है जो HTTP POST विधि के लिए है।
thecoshman

8
जब आप क्लाइंट को संसाधन के URI को निर्दिष्ट करने के लिए चाहते हैं, तो आप PUT का उपयोग करें, जैसे कि webdav में। मैं PUT के पोस्टर के उपयोग से सहमत नहीं हूं, लेकिन इसमें संसाधन बनाने की जगह है, हालांकि यह जगह गुंजाइश में सीमित हो सकती है।
user602525

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