2010-08-18 26 views
6

मैं REST API का सिद्धांत है कि सिर्फ आराम बुनियादी दस्तावेज़ों और उनके में refs वापस देता है howto निम्नलिखित अन्य बातों के प्राप्त कार्यान्वित किया जाता है आदि आदिRESTful API छँटाई दुविधा

उदाहरण एक/कार के लिए/5 मुझे मॉडल दे देंगे: blabla, user_id: 1 और फिर यदि आपको मालिक की आवश्यकता है तो आपको उपयोगकर्ता डेटा प्राप्त करने के लिए/उपयोगकर्ता/1 प्राप्त होगा ..

इस तरह जॉइन और सामान डीबी में टाला जाता है .. सभी चीजें स्वयं और डेटा के बीच जुड़े हुए हैं बाकी ग्राहक भाग पर - कैश, स्केल इत्यादि को कैश/ड्रॉप करने के लिए चीजों को आसान रखना

लेकिन जब आपको सॉर्टिंग की आवश्यकता होती है तो क्या होता है?

कल्पना कीजिए कि निम्नलिखित डेटा प्रदर्शित करने के लिए हमारे पास अग्रभाग पर कुछ दृश्य है: कार मॉडल, उपयोगकर्ता नाम, आदि ... और उदाहरण के लिए आप उपयोगकर्ता नाम से सॉर्ट करना चाहते हैं।

आप वास्तव में/कार/5 उपयोगकर्ता नाम से सॉर्ट करने के नहीं बता सकता है कि यह केवल उपयोगकर्ता आईडी का पता कारण ...

एक विकल्प मैं देख रहा हूँ उपयोगकर्ता/उपयोगकर्ता/सूची से छँटाई है? Sortby = उपयोगकर्ता नाम और फिर उनसे जुड़े हुए आईडी में से कौन सा इंटरकनेक्टिंग वास्तव में कार को संदर्भित करता है। लेकिन इसका मतलब है कि हमें सभी उपयोगकर्ताओं को प्राप्त करने की आवश्यकता है ... और केवल उन लोगों के अंश का उपयोग करें जो कि हत्यारा प्रदर्शन बाधा उत्पन्न करते हैं।

किसी भी संकेत दिए गए

उत्तर

5

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

आप के बजाय (यानी डेटाबेस पक्ष मिलती है) सभी जानकारी है कि आप को दिखाने चाहते हैं वापस लाने, तो ग्राहकों को कम प्रश्नों बनाने के लिए है करने के लिए जा रहे हैं, और आप किए बिना अपने तरह कर सकता है (आलसी) सभी बच्चे वस्तुओं को लोड करें।

दूसरा विकल्प बच्चों के ऑब्जेक्ट्स को बाल एक्सएमएल तत्वों के रूप में वापस लाने के लिए होगा (इसी तरह से OpenStreetMap का रीस्टफुल इंटरफ़ेस कैसे काम करता है)। आपके पास अभी भी ग्राहक से एक ही हिट है, और आप डीबी पर लोड को कम करने के लिए क्वेरी को अनुकूलित करने में सक्षम होना चाहिए।

4

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

आप कार एंडऑनर्स नामक एक और संसाधन बना सकते हैं या इसी तरह से जुड़ी सूची लौटा सकते हैं, जिस बिंदु पर सर्वर पर सॉर्ट करना उचित हो जाता है।

2

मैं आदर्श RESTful क्वेरी है कि मैं, लिखने के लिए उदाहरण के लिए करना चाहते हैं की कल्पना से शुरू होगी:

/car/list?sortby=username 

और फिर यह पता लगाने कि लागू करने के लिए कैसे।

अब आप अपने सूची विधि आप कार वस्तुओं कि उपयोगकर्ता नाम के संपर्क में न के रूप में आप ने कहा देता है, लेकिन मुझे लगता है कि मायने रखती है नहीं है। सूची तैयार होने से पहले सभी सॉर्टिंग सर्वर पर होनी चाहिए।

आप अपने कार ऐसा करने में कुछ बिंदु पर वस्तुओं उपयोगकर्ता को वस्तुओं में शामिल होने की जरूरत करने जा रहे हैं, और वहाँ कि इस मुद्दे को dodging का कोई रास्ता नहीं है। आपके पास एकमात्र विकल्प है जहां आप इसे करते हैं।

यदि आप पारंपरिक आरडीबीएमएस के साथ काम कर रहे हैं तो यह डीबी स्तर पर ऐसा करने के लिए समझ में आता है।


आप अपने आवेदन एपीआई और डेटाबेस के बीच एक ORM परत का उपयोग कर रहे हैं? यदि आप छँटाई आप ऐसा कर सकते करने के लिए एक RESTful दृष्टिकोण चाहते

/cars/5 
/users/1 

अब, सामान्य रूप में:

+0

अच्छी तरह से सभी दृढ़ता आरईएसटी के पीछे है .. वर्तमान में बाकी ओआरएम का उपयोग कर रहा है लेकिन मुझे नहीं लगता कि यह प्रासंगिक है। –

+1

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

2

सबसे पहले, अपने उदाहरण /car/5 क्रम में RESTful होने के लिए संसाधन का बहुवचन संस्करण होना चाहिए

/cars?sort=make&order=asc 

अपने उदाहरण में, आप का उल्लेख है कि आप उपयोगकर्ता नाम से कारों क्रमबद्ध करना चाहते हैं। हालांकि, जैसा कि आप उल्लेख करते हैं, cars संग्रह को users के बारे में कुछ भी पता नहीं होना चाहिए। तो यदि आप कारों की एक सूची प्रदर्शित करना चाहते हैं और उन्हें उपयोगकर्ता द्वारा समूहित करना चाहते हैं, तो आप क्या करते हैं? आपको इस जानकारी को पुनः प्राप्त करने के लिए एक तरीका चाहिए। ऐसा करने का एक तरीका यह उन लूप करने के लिए है और प्रत्येक उपयोगकर्ता के साथ जुड़े कारों का अनुरोध:

# pseudo code 

users.each do |user| 
    # assuming the user id is 5, 
    # to display the user's cars, 
    # we need to request /users/5/cars 
end 

तो हम /users/5/cars जैसी URL में प्रत्येक व्यक्ति के लिए कारों की सूची का अनुरोध कर सकते हैं। यह एक घोंसला संसाधन के रूप में जाना जाता है। हम केवल उन कारों का अनुरोध कर रहे हैं जो उपयोगकर्ता से संबंधित हैं 5.

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

/users/cars?sort=username&order=asc 

यह उपयोगकर्ताओं को और अपनी कारों उपयोगकर्ता नाम द्वारा आदेश दिया की एक सरणी वापसी होगी:

एक और दृष्टिकोण है, जो शायद बेहतर है, एक अनुरोध करने के लिए यह करने के लिए है।

और फिर भी एक और दृष्टिकोण हो सकता है:

/users?include=[cars]&sort=username&order=asc 

लेकिन मैं पिछले जितना इस दृष्टिकोण की तरह नहीं है। मैं /users/cars के पिछले दृष्टिकोण की सिफारिश करता हूं।

साइड ध्यान दें: अपनी सूची पृष्ठवार किया जाना चाहिए ताकि वहाँ users के सभी का अनुरोध जब आप केवल एक आंशिक सूची प्रदर्शित कर रहे हैं की भूमि के ऊपर नहीं है।

/users?page=1&per_page=50 
+1

बहुवचन संसाधन नामकरण आरईएसटी की आवश्यकता नहीं है - प्रत्येक संसाधन के लिए जोखिम के लिए एक आवश्यकता क्या है: अर्थात्, प्रत्येक खुला संसाधन को उसी तरह से व्यवहार करना चाहिए (उपभोक्ता के परिप्रेक्ष्य से) उपलब्ध प्रोटोकॉल विधियों (जीईटी, पोस्ट , डिलीट, इत्यादि ...) –

1

डेटाबेस करने के लिए तैयार कर रहे हैं जल्दी से जुड़ जाता है, तो यह ग्राहक या अपने सर्वर अनुप्रयोग मेरे लिए कोई मतलब नहीं है के लिए छोड़कर।

आरईएसटी पर मैंने जो कुछ भी पढ़ा है, वह कहता है कि संस्थाओं/संसाधनों के बीच संबंध भी संसाधन होना चाहिए। इसलिए आपके पास संसाधन /mydomain.com/CarsAndUsers होना चाहिए जो कि शामिल/रिश्ते का प्रतिनिधित्व करता है।

तो फिर तुम किसी भी अन्य की तरह है कि संसाधन के वर्गीकरण में क्या कर सकते हैं, और यह डेटाबेस द्वारा नियंत्रित किया जाएगा:

/mydomain.com/CarsAndUsers?sortby=username

तुम भी करने के लिए आवेदन कर सकते हैं छानने वह संसाधन (और पेजिंग) किसी भी अन्य संसाधन की तरह।

संपादित करें:

टिप्पणियों के अनुसार यह बेहतर होगा कुछ इस तरह करना है: इशारा करते हुए के लिए

/कारों एम्बेड = उपयोगकर्ता, sortby = उपयोगकर्ता नाम

धन्यवाद एरिक? यह बाहर है।

+0

यह एपीआई एंडपॉइंट्स के संयोजक विस्फोट के लिए एक नुस्खा है। इनलाइन वस्तुओं (अनिवार्य रूप से प्रतिनिधित्व में शामिल) का अनुरोध करने के लिए पैरामीटर का उपयोग करने के लिए एक और आम रीस्टफुल दृष्टिकोण है। उदाहरण के लिए: '/ एल्बम? एम्बेड = कलाकार'। एम्बेड करने के लिए उपलब्ध संसाधनों में विकल्प खोजने योग्य बनाने के लिए एक हाइपरमीडिया 'लिंक' संग्रह में लिंक हो सकते हैं। –

+0

धन्यवाद एरिक, जबकि मैं एंडपॉइंट्स के विस्फोट के बारे में आपके बिंदु से सहमत हूं, सवाल संबंधित वस्तुओं के बारे में नहीं है बल्कि संबंधित सेट की संपत्ति के आधार पर एक सेट को सॉर्ट करने के बारे में है। मुझे यकीन नहीं है कि आप क्या सुझाव दे रहे हैं कि विशेष मुद्दे हल करता है। या आप कह रहे हैं कि ओपी यह कर सकता है: /कारें? एम्बेड = उपयोगकर्ता, sortby = उपयोगकर्ता नाम – rmcsharry

+0

हाँ, यह वही है जो मैं सुझाव दे रहा हूं। –

संबंधित मुद्दे