क्या अन्य संसाधनों का एकवचन और बहुवचन होना उचित है?


10

मैं सोच रहा था अगर, इस तरह से एक और अधिक पारंपरिक लेआउट के बजाय:

api/Products
GET // gets product(s) by id
PUT // updates product(s) by id
DELETE // deletes (product(s) by id
POST // creates product(s)

उदाहरण के लिए एक विलक्षण और बहुवचन का होना अधिक उपयोगी होगा:

api/Product
GET // gets a product by id
PUT // updates a product by id
DELETE // deletes a product by id
POST // creates a product

api/Products
GET // gets a collection of products by id
PUT // updates a collection of products by id
DELETE // deletes a collection of products (not the products themselves)
POST // creates a collection of products based on filter parameters passed

तो, आप कर सकते हैं उत्पादों का एक संग्रह बनाने के लिए:

POST api/Products {data: filters} // returns api/Products/<id>

और फिर, इसे संदर्भित करने के लिए, आप कर सकते हैं:

GET api/Products/<id> // returns array of products

मेरी राय में, इस तरह से चीजें करने का मुख्य लाभ यह है कि यह उत्पादों के संग्रह के आसान कैशिंग के लिए अनुमति देता है। उदाहरण के लिए, उत्पादों के संग्रह पर एक घंटे का जीवनकाल लगाया जा सकता है, इस प्रकार यह सर्वर पर कॉल को काफी कम कर देता है। बेशक, मैं वर्तमान में केवल इस तरह से चीजों को करने का अच्छा पक्ष देख रहा हूं, नकारात्मक पक्ष क्या है?

जवाबों:


6

अक्सर जब कोई संग्रह आपके एपीआई के साथ बातचीत करने का सबसे उपयोगी तरीका होने जा रहा है, तो यह केवल एक सदस्य के साथ एक संग्रह के रूप में एकल के बारे में सोचना आसान हो सकता है। फिर अगर बाद में आप एकल के साथ बातचीत करने के लिए एक एपीआई को उजागर करना चाहते हैं, तो इसे केवल उस सदस्य के साथ संग्रह में पारित एकल को बदलने के तहत कवर करने की आवश्यकता है और फिर यह दूसरे एपीआई के समान कार्यान्वयन का उपयोग करता है।

मुझे लगता है कि मैं यहां क्या कह रहा हूं, अगर आप चाहते हैं कि संग्रह एक इंटरैक्शन तंत्र हो, तो केवल एपीआई के संग्रह के साथ शुरू करें और सिस्टम के पूरा होने के बाद, दूसरा एपीआई एक सरल सहायक इंटरफ़ेस है जिसे आप जोड़ सकते हैं, अगर आप इसे विशेष रूप से उपयोगी पाते हैं। हालाँकि आप पा सकते हैं कि यह उपयोगिता कम से कम YAGNI को लागू करने के लिए पर्याप्त है और आप चाहते हैं एकल के कुछ उदाहरणों के लिए संग्रह इंटरफ़ेस का उपयोग करें।


जबकि मैं आपकी भावना से सहमत हूं, यह मानते हुए कि हम ऊपर दिए गए उदाहरण का उपयोग करते हैं, यह देखते हुए कि POST एपीआई / उत्पाद का उपयोग संग्रह फ़िल्टर मापदंडों को पारित करने के लिए किया जाएगा और नए उत्पादों के निर्माण के लिए डेटा नहीं होगा, एक नया उत्पाद बनाने का एक उचित तरीका क्या होगा बिना एपीआई / उत्पाद के?
ईवा

@ ईवन एपि / प्रोडक्ट्स मल्टीपल (या एक का एक संग्रह) उत्पाद क्यों पोस्ट नहीं कर सकते? यह मेरे लिए सबसे तर्कसंगत लगता है। शायद फ़िल्टर बनाने के लिए उत्पाद / फ़िल्टर पोस्ट करें, या प्राप्त करें कि वे एक पुनर्प्राप्ति हैं और रचनात्मक कार्य नहीं हैं।
जिमी हॉफ

विस्तार के लिए धन्यवाद, जिमी। इसका कारण यह नहीं था कि मैं इस पर विचार कर रहा था, उपरोक्त उदाहरण में, एक पहचाने गए संसाधन के रूप में और अपने आप में संग्रह। बैकएंड पर, एपीआई / उत्पाद "उत्पाद" और एपीआई / उत्पाद इस प्रकार "प्रोडक्लेक्शन" हो सकता है। हालाँकि, कुछ विचार के बाद, मुझे लगता है कि यह बेहतर होगा कि आप एपीआई से दूर रहें, जैसा कि आपके सुझाव में है ... अब असली सवाल पर, क्या आपने उस ट्रकस्टॉप से ​​थाईलैंड के लिए अपने रास्ते से भाग लिया, या छोड़ दें कार के बूट में?
ईवा

@ इवान मैं आपको दो संकेत दूंगा: सीगल।
जिमी होफा

1

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

यदि आप इसे कम करना चाहते हैं, तो आप अपनी REST सेवा के लिए SDK स्वयं जनरेट कर सकते हैं। या, आप सिर्फ राय दी जा सकती है और शिकायत से निपट सकते हैं :)

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