2012-07-02 14 views
13

डेवलपर यहां एक दोस्ताना हो रही है की एक संख्या है (कुछ कह सकते हैं कि धार्मिक) के बारे में RESTful API से एक GET अनुरोधअनुरोध किया गया संसाधन की आईडी वापसी करना चाहिए कि क्या चर्चा। के निम्नलिखित GET अनुरोध मान लेते हैं:क्या एक विश्वसनीय प्रतिक्रिया प्रतिक्रिया संसाधन की आईडी लौटा देनी चाहिए?

http://my.api.com/rest/users/23

यह वर्तमान में प्रस्तुत करती है:

{"name": "Jim", "age": 40, "favoriteColor": "blue"} 

ध्यान दें कि "आईडी" परिणाम सेट से लापता है।

मूल रूप से 4 शिविर इस मुद्दे से जूझ रहे हैं।

सीएएमपी # 1: जब कॉलर्स जीईटी अनुरोध करते हैं, तो वे पहले से ही आईडी को जानते हैं। इसलिए, परिणाम सेट में आईडी शामिल होना चाहिए। यदि कॉलर्स को यूआई संपादन को सक्षम करने के लिए इस डेटा की आवश्यकता है, तो कॉलर्स को आईडी 23 से गुजरना होगा, शायद सदस्य {"आईडी": 23} मैन्युअल रूप से JSON में जोड़ना होगा।
कैंप # 1 में लोग भी तर्क देते हैं कि परिणाम सेट में आईडी की उपस्थिति से संकेत मिलेगा कि यह मान संशोधित किया जा सकता है, जो निश्चित रूप से नहीं हो सकता है।

सीएएमपी # 2: आईडी के बिना, जेएसओएन परिणाम सेट को यूआई रूपों में संपादन/अद्यतन संचालन के लिए मूल रूप से उपयोग नहीं किया जा सकता है। इसके बजाए, AJAX कॉलबैक तंत्र को आईडी फ़ील्ड को पास करने और परिणाम सेट में मैन्युअल रूप से जोड़ने के लिए ज़िम्मेदार होना आवश्यक है। यह klunky और त्रुटि प्रवण लगता है। यूआई लोग तर्क दे रहे हैं कि परिणाम "लगता है" जैसे गायब डेटा जैसा मौजूद होना चाहिए, अर्थात् आईडी।

कैंप # 3: ये लोग स्थिरता के बारे में चिंतित हैं। यदि हमारे पास कभी भी एपीआई द्वारा लौटाए गए उपयोगकर्ता ऑब्जेक्ट्स का संग्रह होता है, तो इन ऑब्जेक्ट्स में आईडी शामिल होना चाहिए। इसलिए, स्थिरता के लिए, जीईटी के सिंगलटन संस्करण में आईडी भी शामिल होना चाहिए।

कैंप # 4: ये लोग सुझाव दे रहे हैं कि उपयोगकर्ता के लिए जीईटी अनुरोध हाइपरमीडिया या सेल्फलिंक्स के रूप में मेटा डेटा लौटा सकता है जिसमें आईडी शामिल होगी।

यह एक गूढ़ नहीं है "कौन सही है?" तर्क, या तो। हमारे द्वारा उठाए जाने वाले दृष्टिकोण से हमारे एपीआई के आकार को निर्देशित किया जाएगा और नए कुछ हफ्तों में कई डेवलपर्स के काम के भार को प्रभावित किया जाएगा।

+1

यह सिर्फ एक व्यक्तिगत राय है लेकिन मैं शिविर 2 और 3 के साथ सहमत हूं। मुझे लगता है कि प्रतिनिधित्व में सभी उपलब्ध डेटा, आईडी शामिल होना चाहिए। विशेष रूप से जब यह एक प्राकृतिक आईडी है। यह एक बहुत ही रोचक सवाल है लेकिन मुझे संदेह है कि आपको एक साधारण जवाब मिलेगा। – toniedzwiedz

+2

ग्राहक के परिप्रेक्ष्य से, जीईटी * यू * आईडी में इस्तेमाल यूआरआई है। मैं कैंप 4 के लिए वोट दूंगा कि स्वयं लिंक में उपयोग की जाने वाली "आईडी" पूरी यूआरआई है, न केवल अंत में हिस्सा है। –

+0

कैंप 4 में लोगों को यह देखने के लिए राहत मिलेगी कि वे अकेले नहीं हैं। और पुष्टि करने के लिए, यदि वे आईडी शामिल करना चाहते हैं, तो यह एक पूर्ण यूआरआई के अंदर एम्बेडेड होगा। इसका मतलब है कि आईडी निकालने के लिए यूआरआई को पार्स करना आवश्यक होगा, लेकिन कम से कम शिविर 2 लोगों के लिए उन्हें JSON पेलोड को मैन्युअल रूप से बंद करने की आवश्यकता नहीं है। फ्लिप पक्ष पर, कैंप 1 अनुयायी बहस कर रहे हैं कि ऐसा यूआरआई केवल आरईएसटी स्तर 3 का आंशिक कार्यान्वयन होगा, इसलिए इस कारण से उन्हें एम्बेडेड सेल्फलिंक्स पसंद नहीं हैं। –

उत्तर

10

यह राय का विषय है, जो कि स्टैक ओवरफ्लो को देखना पसंद नहीं है। किसी भी मामले में, मैं अपनी पेशकश करूंगा।

आप किसी ऑब्जेक्ट या संसाधन की स्थिति का प्रतिनिधित्व कर रहे हैं। आईडी उस प्रतिनिधित्व का हिस्सा है, और इसलिए JSON पैकेट में शामिल किया जाना चाहिए। यह संसाधन की एक संपत्ति है। क्या कॉलर आईडी जानता है या नहीं, चर्चा के लिए विशेष रूप से जर्मनी नहीं है। सीएएमपी # 1 कमजोर जमीन पर है।

जो संग्रह आप संग्रह के बारे में उठाते हैं वह बहुत प्रासंगिक है। क्या पुनर्प्राप्ति -1 ऑपरेशन के लिए एक प्रतिनिधित्व का उपयोग करना और पुनर्प्राप्ति-एन ऑपरेशन के लिए एक और प्रतिनिधित्व करना समझ में आता है? मुझे नहीं लगता।क्या डेटा प्रतिनिधित्व कि ग्राहकों के लिए स्थानांतरित कर रहा है में शामिल किया जाना चाहिए, और किस परिस्थिति में -

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

सभी पर्याप्त परिपक्व आरईएसटी प्रोटोकॉल में लौटाए गए डेटा को आकार देने की क्षमता है।

उदाहरण के लिए

, देख

  • फेसबुक ग्राफ एपीआई, http://developers.facebook.com/docs/reference/api/
  • StackExchange एपीआई v2.0 - एक "फिल्टर" है वस्तु आप ठीक आकार देने के लिए क्या वापस आ जाता है पारित कर सकते हैं।
  • कॉच डीबी एपीआई - प्रत्येक व्यू के लिए एक नक्शा फ़ंक्शन है, जो निर्धारित करता है कि कौन सा डेटा लौटाया जाता है। इसमें एक कंबल क्वेरी पैरामीटर भी है, include_docs, जो सर्वर को पूर्ण ऑब्जेक्ट्स या बस मेटाडेटा शामिल करने का निर्देश देता है। (कुछ मामलों में आप केवल डेटा, न कि वास्तविक डेटा की गिनती कर सकते हैं।)

फेसबुक आप स्पष्ट रूप से क्षेत्रों आप चाहते हैं निर्दिष्ट करने के लिए अनुमति देता है।

enter image description here

stackexchange एपीआई दिलचस्प है। उन्होंने आकार देने के समर्थन के लिए एक पूरी तरह से नई प्रकार की वस्तु परिभाषित की है। आप एपीआई का उपयोग "फ़िल्टर" को परिभाषित करने और सर्वर की तरफ से सहेजने के लिए कर सकते हैं। फिर आपकी क्वेरी में आप फ़िल्टर की आईडी के साथ फ़िल्टर पैरामीटर पास करते हैं, और लौटा ऑब्जेक्ट प्रस्तुतियों में फ़िल्टर में निर्दिष्ट सभी विशेषताओं को शामिल किया जाता है। फ़िल्टर के बिना आपको फ़ील्ड का "डिफ़ॉल्ट" सबसेट मिलता है। "सभी फ़ील्ड" प्राप्त करने के लिए आपको एक समावेशी फ़िल्टर को परिभाषित करने की आवश्यकता है।

आप https://api.stackexchange.com/docs/answers

पर कार्रवाई में देख सकते हैं ... और विशेष रूप से फिल्टर विनिर्देश संवाद देखते हैं।

enter image description here


काम करने के लिए कोई भी सही तरीका नहीं है। आपको "आकार देने" सुविधा की जटिलता को संतुलित करने की आवश्यकता है जिसे आप विकसित करने के लिए लागत और एपीआई का उपयोग करने वाले ऐप्स की ज़रूरतों के साथ समर्थन करते हैं।

+0

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

+1

मेरे अंत में, मैंने शिविर # 1 को खुश करने के लिए काम किया है। अब मैं कुंजी/वैल्यू जोड़े की एक सरणी पास करता हूं जिसे मैं AJAX- आधारित कॉल द्वारा लौटाए गए डेटा को रीस्टफुल सेवाओं में बढ़ाने या पूरक करने के लिए उपयोग कर सकता हूं।यह काम करता है, लेकिन यह सही महसूस नहीं करता है। कैंप # 1 में लोग आईडी में जोड़ने के लिए सहमत हुए हैं यदि मैं और एपीआई के अन्य उपभोक्ता वास्तव में जीईटी पेलोड प्रतिक्रिया के हिस्से के रूप में यह डेटा चाहते हैं। –

+2

मुझे आपसे यह पूछने दो - क्या होगा यदि क्वेरी "आईडी = एन के साथ व्यक्ति प्राप्त न करें" बल्कि "दस्तावेज़ के लेखक को प्राप्त करें" Z "? यदि आप शिविर # 1 से सलाह का पालन करते हैं, तो आपको एक व्यक्ति वस्तु मिलती है लेकिन आप उस व्यक्ति की आईडी नहीं जानते हैं। "शिविर # 1" स्थिति बहुत संकीर्ण और अस्थिर लगती है। परिदृश्यों के सबसे सरल और अव्यवहारिक को छोड़कर, कोई समझ नहीं आता है। – Cheeso

1

पुराना सवाल है, लेकिन जब से मैं यहाँ किसी चीज़ को खोजने गया, यहाँ यह अभी तक एक और राय जाता है:

सबसे पहले, मुझे लगता है कि URL होना चाहिए:

http://my.api.com/rest/Users/23

नहीं

http://my.api.com/rest/getUsers/23

"जीईटी" HTTP विधि पर है, यूआरएल पर नहीं। यह सिर्फ नामकरण है, लेकिन चीज स्पष्ट करने में मदद करता है, IMHO।

आप इस बारे में सोचते हैं, तो एक संसाधन संशोधन एक PUT

PUT http://my.api.com/rest/Users/23

उस मामले में साथ ही URL में ऐसा करने की जरूरत है, ग्राहक यूआरएल, नहीं आईडी का ट्रैक रखने की जरूरत है। इससे कोई फर्क नहीं पड़ता कि संसाधन आईडी फ़ील्ड देता है या नहीं। यह उस मानचित्र का मानचित्र रखने के लिए ग्राहक पर निर्भर करता है जहां से इसे प्राप्त किया गया था।

आप एक अलग यूआरएल के लिए एक resorce डाल करने के लिए प्रयास करते हैं तो कहते हैं कि "http://my.api.com/rest/Users/24", कुछ परिदृश्यों होगा:

1) http://my.api.com/rest/Users/24 सर्वर पर पहले से मौजूद है और सर्वर एक अद्यतन के रूप में स्वीकार करता है संसाधन

2) http://my.api.com/rest/Users/24 सर्वर पर मौजूद नहीं है और:

एक) सर्वर स्वीकार करता है कि एक उपयोगकर्ता एक unexisting संसाधन (अनुशंसित नहीं) ख) सर्वर एक पोस्ट के रूप में एक PUT स्वीकार करता है के लिए एक आईडी (24) प्रदान कर रहा है

ए + बी में, सर्वर एक नया संसाधन बनाएगा।

तो:

1) कितना आप अपने ग्राहक पर भरोसा पर निर्भर करता है, तो आप शायद बनाने चाहिए एक "चेक-इन/चेक-आउट" सर्वर पर नियंत्रण दूसरे के साथ एक संसाधन को अधिलेखित करने से बचने के लिए (यह RESTful है ?)

2) आपको आईडी बनाने वाले ग्राहकों को स्वीकार नहीं करना चाहिए (http://my.api.com/rest/Users/ पोस्ट करने के लिए ठीक है, http://my.api.com/rest/Users/24 नहीं) और आपको गैर-मौजूदा संसाधनों के लिए PUT स्वीकार नहीं करना चाहिए।

संपादित:

तो मेरा मानना ​​है कि संसाधन, उसके URL द्वारा की पहचान की है आईडी के आधार पर नहीं। या, दूसरे शब्दों में, संसाधन आईडी http://my.api.com/rest/Users/23 है, 23 नहीं।

समझ में आता है?

+0

मैं मानता हूं कि यूआरआई में "पाने" को एम्बेड करने की गलती थी। मैं देखूंगा कि क्या मैं ओपी को संशोधित कर सकता हूं। प्रतिक्रिया के लिए धन्यवाद। –

+0

"तो मुझे विश्वास है कि संसाधन को इसके यूआरएल द्वारा पहचाना जाता है, आईडी द्वारा नहीं।" यह उत्तर का मूल है। आपके क्लाइंट को URL का निर्माण नहीं करना चाहिए, इसलिए जब तक किसी अन्य उद्देश्य के लिए आईडी का उपयोग नहीं किया जाता है, तो आपको इसे प्रतिक्रिया में शामिल करने की आवश्यकता नहीं है ... कभी भी। एक संग्रह में भी नहीं। यदि आप क्लाइंट को यह जानना चाहते हैं कि एकवचन संसाधन कहां मिलना है, तो आईडी के बजाय एक यूआरएल प्रदान करें। [हेटोआस] देखें (http://en.wikipedia.org/wiki/HATEOAS)। –

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