एक नेस्टेड एपीआई में नेस्टेड संसाधनों का उपयोग कब करें


16

मेरे पास दो संसाधन हैं: उपयोगकर्ता और लिंक।

उपयोगकर्ताओं के पास उनसे जुड़े कई लिंक हो सकते हैं। मैंने अपना RESTful API डिज़ाइन किया है ताकि आप निम्नलिखित URI में किसी उपयोगकर्ता से जुड़े लिंक तक पहुँच सकें:

/users/:id/links

हालाँकि, मुझे हमेशा केवल लिंक के लिए एक यूआरआई की आवश्यकता होती है - कभी-कभी मुझे उपयोगकर्ता की परवाह किए बिना सभी लिंक चाहिए।

इसके लिए मेरे पास है:

/links

क्या यह ठीक है? लिंक के लिए दो URI होने?

मुझे आश्चर्य है कि अगर मुझे इसके बजाय एक यूआरआई वाले उपयोगकर्ता के लिए लिंक तक पहुंचना चाहिए जैसे:

/links/user/:id या /links/?user=:id

इस तरह, मेरे पास लिंक के लिए केवल एक संसाधन है।


3
हम्म .. यह एक और अधिक सुरुचिपूर्ण लगता है:/links/user/:id
TheMarceloR

7
@theMarceloR: यह तीन में से केवल उदाहरण है कि मैं है नहीं है , विशेष रूप से स्पष्ट लगता है। लिंक या उपयोगकर्ता के लिए संसाधन है? URI नेस्टेड रिसोर्स मेथड ( /users/:id/links) या क्वेरी स्ट्रिंग मेथड ( /links/?user=:id) का उपयोग करके बहुत कम अस्पष्ट है क्योंकि यह वास्तव में एक क्वेरी है। /links/user/:idअच्छा लग सकता है और / या कुछ फ्रेमवर्क में रूट करना आसान हो सकता है लेकिन यह वास्तव में काफी भ्रामक है।
Aaronaught

जवाबों:


16

नहीं, एक ही "चीज़" के लिए कई संसाधन होने के साथ कुछ भी गलत नहीं है, इस मामले में लिंक की सूची।

हम हाल ही में इसी समस्या से जूझ रहे थे। हमारा निर्णय सभी संसाधनों को प्राप्त करना था जहां एक सख्त स्वामित्व नहीं है जो घोंसले में न हो। दूसरे शब्दों में, लिंक के तहत मॉडलिंग की जाएगी

/links -- all links
/links/:linkid -- a particular link

फिर, लिंक संग्रह पर फ़िल्टर क्वेरी पैरामीटर के रूप में व्यक्त किए जाते हैं। तो एक निश्चित उपयोगकर्ता के लिंक प्राप्त करने के लिए, आप उपयोग करेंगे:

/links?user=/users/:userid

यह फिल्टर की आसान संरचना के लिए भी अनुमति देता है:

/links?user=/users/10&since=2013-01-01

और अवधारणा को समझना आसान है - आपके पास मदों का एक संग्रह है, और आप इसमें फिल्टर जोड़ते हैं।

यह कहा जा रहा है, किसी भी अन्य URI नामकरण योजना की तुलना में इस दृष्टिकोण के बारे में अधिक "RESTful" कुछ भी नहीं है। यह सिर्फ एक सम्मेलन है जिसे हमने मानव-पठनीय और आसान पाया है ताकि डेवलपर्स हमें समझ सकें और गले लगा सकें। REST को इस बात की परवाह नहीं है कि आपने अपने संसाधन पहचानकर्ताओं में क्या रखा है।


1
"सभी संसाधन जहां एक सख्त स्वामित्व नहीं है, जहां घोंसला नहीं होना चाहिए" एक अच्छे नियम की तरह लगता है। बहुत बहुत धन्यवाद।
ओलिवर जोसेफ ऐश

5
मैं कहूंगा कि एक ही भौतिक इकाई के लिए कई संसाधन होने में कुछ गड़बड़ है, लेकिन वास्तव में ऐसा नहीं है। प्रत्येक व्यक्तिगत लिंक में एक कैनोनिकल URL (लिंक /: id) होता है, जबकि ऊपर दिए गए प्रत्येक संसाधन वास्तव में एक ही संसाधन (/ लिंक) होते हैं, जिस पर फ़िल्टर लागू होते हैं। इसके अलावा, मैं ?user=users/:useridक्वेरी स्ट्रिंग में अजीब हूँ ; क्या गलत है बस ?userid=:userid?
Aaronaught

2
@ चेतावनी: नंगे आईडी के बजाय यूरी से चिपके रहने का कारण यह है कि ग्राहक सभी संसाधन पहचानकर्ताओं के साथ समान व्यवहार कर सकते हैं, यह एक क्लाइंट को केवल यह जानना होगा कि 'इस उपयोगकर्ता द्वारा पहचाना गया है "/*******"; जहां *अपारदर्शी हैं। लेकिन उसी पहचानकर्ता का उपयोग हमेशा उस संसाधन को संदर्भित करने के लिए किया जा सकता है (जैसे लिंक के साथ), उस संसाधन का सबसे वर्तमान संस्करण लाने के लिए, और इसी तरह। उस uri की सामग्री को केवल मूल सर्वर द्वारा समझा जाता है। इसका मतलब यह भी है कि यदि पहचानकर्ताओं को बदलने की आवश्यकता है, तो कहें /realm/:businessid/users/:id, क्लाइंट बिल्कुल भी नहीं बदलेगा।
सिंगलनेगलाइजेशन क्लेम

@TokenMacGuy: क्षमा करें, मैं आपकी टिप्पणी के किसी भी हिस्से को नहीं समझता। /users/:userid/linksऔर के बीच व्यावहारिक अंतर क्या है /links?userid=:userid? दोनों मामलों में पहचानकर्ता नहीं बदलते हैं, वे उस संसाधन के वर्तमान संस्करण को प्राप्त करते हैं, और क्लाइंट उन्हें उसी तरह व्यवहार करता है। इसके लिए विहित URL जैसी कोई चीज नहीं है क्योंकि यह संसाधन नहीं है, यह एक क्वेरी है, इसलिए ये केवल दो अलग-अलग प्रकार के क्वेरी सिंटैक्स हैं। यदि URL संरचना में परिवर्तन होता है तो क्लाइंट को बदलने की आवश्यकता नहीं होगी, यह भी स्पष्ट नहीं हूं; जब तक 301 जगह पर हो तब तक REST में एक परिवर्तन को माना जाता है।
हारून को

1
@ चेतावनी: मुझे आपकी चिंता गलत लग सकती है। मान लेना /linksएक क्वेरी इंटरफ़ेस का समर्थन करता है, /links?user=/users/123क्लाइंट में संसाधन पहचानकर्ताओं के लिए एक ब्लैक-बॉक्स दृष्टिकोण की अनुमति देता है जो /links?userid=123नहीं करता है। उत्तरार्द्ध को ग्राहक को यह समझने की आवश्यकता है कि उपयोगकर्ता क्या है और इसे कैसे प्राप्त किया जाए, संभवतः इसे प्राप्त किए गए संसाधन से बाहर /users/123या /links/456/user। पूर्व का मतलब है कि ग्राहक यूएमआई का उपयोग नहीं कर सकता; मान /links/.../userएक हाइपरमीडिया प्रतिक्रिया (साथ, का कहना है कि देता है Location:हेडर)।
22

1

तो मेरी चिंता यह है: / user /: userid / links रिटर्न "लिंक", लेकिन अगर user_id की पहचान नहीं की गई है, तो इसे 404 वापस करना चाहिए।

तथापि

/ लिंक? userid =: userid संभावित रूप से एक खाली सूची (अनिवार्य रूप से 200) लौटाएगा जो वास्तव में शायद एक बग है। और काफी संभव है।

हालांकि दोनों काम करते हैं, घोंसले के शिकार आपको अतिरिक्त कार्यक्षमता प्रदान करते हैं जो आप बाद में आकर्षित कर सकते हैं।

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