प्रथम
प्रति RFC 3986 §3.4 (यूनिफ़ॉर्म रिसोर्स आइडेंटिफ़ायर Syn (सिंटैक्स कंपोनेंट्स) के अनुसार | क्वेरी |
3.4 प्रश्न
क्वेरी घटक में गैर-पदानुक्रमित डेटा होता है जो पथ घटक (धारा 3.3) में डेटा के साथ, URI की योजना और नामकरण प्राधिकरण (यदि कोई हो) के दायरे में एक संसाधन की पहचान करने का कार्य करता है।
क्वेरी घटक गैर-पदानुक्रमित डेटा की पुनर्प्राप्ति के लिए हैं; परिवार के पेड़ की तुलना में प्रकृति में कुछ चीजें अधिक पदानुक्रमित हैं! एर्गो - भले ही आपको लगता है कि यह "रीस्ट-वाई" है या नहीं- इंटरनेट पर सिस्टम को विकसित करने के लिए प्रारूप, प्रोटोकॉल और रूपरेखा के अनुरूप होने के लिए, आपको इस जानकारी की पहचान करने के लिए क्वेरी स्ट्रिंग का उपयोग नहीं करना चाहिए।
REST का इस परिभाषा से कोई लेना-देना नहीं है।
आपके विशिष्ट प्रश्नों को संबोधित करने से पहले, "खोज" के आपके क्वेरी पैरामीटर का नाम खराब है। बेहतर होगा कि आप अपने क्वेरी सेगमेंट को कुंजी-मूल्य वाले जोड़े के शब्दकोश के रूप में मानें।
आपकी क्वेरी स्ट्रिंग अधिक उपयुक्त रूप से परिभाषित की जा सकती है
?first_name={firstName}&last_name={lastName}&birth_date={birthDate}
आदि।
अपने विशिष्ट प्रश्नों के उत्तर देने के लिए
1) कौन सा एपीआई डिजाइन अधिक प्रतिष्ठित है, और क्यों? शब्दार्थ, उनका अर्थ और व्यवहार एक जैसा है। यूआरआई में अंतिम संसाधन "बच्चे" हैं, प्रभावी रूप से यह कहते हुए कि ग्राहक बाल संसाधन पर काम कर रहा है।
मुझे नहीं लगता कि यह उतना ही स्पष्ट है जितना आप विश्वास करते हैं।
इनमें से कोई भी संसाधन इंटरफ़ेस RESTful नहीं है। प्रमुख RESTful स्थापत्य शैली के लिए पूर्व शर्त है कि एप्लिकेशन स्थिति संक्रमण हाइपरमीडिया के रूप में सर्वर से सूचित किया जाना चाहिए है। लोगों ने यूआरआई की संरचना पर कुछ हद तक उन्हें "रेस्टफुल यूआरआई" बनाने के लिए प्रेरित किया है, लेकिन आरईएसटी के बारे में औपचारिक साहित्य वास्तव में इस बारे में कहने के लिए बहुत कम है। मेरा निजी मत है कि REST के बारे में बहुत कुछ मेटा-गलत जानकारी पुरानी, बुरी आदतों को तोड़ने के इरादे से प्रकाशित की गई थी। (वास्तव में "रेस्टफुल" प्रणाली का निर्माण वास्तव में काफी काम की चीज है। उद्योग "रेस्ट" पर चमकता है और निरर्थक योग्यता और प्रतिबंधों के साथ कुछ रूढ़िवादी चिंताओं से भरा है।)
REST साहित्य क्या कहता है कि यदि आप HTTP को अपने एप्लिकेशन प्रोटोकॉल के रूप में उपयोग करने जा रहे हैं, तो आपको प्रोटोकॉल की विशिष्टताओं की औपचारिक आवश्यकताओं का पालन करना चाहिए और आप "http को बना नहीं सकते क्योंकि आप जाते हैं और फिर भी घोषणा करते हैं कि आप http का उपयोग कर रहे हैं" ; यदि आप अपने संसाधनों की पहचान करने के लिए URI का उपयोग करने जा रहे हैं, तो आपको URI / URL के बारे में विशिष्टताओं की औपचारिक आवश्यकताओं का पालन करना चाहिए।
आपका प्रश्न सीधे RFC3986 ,3.4 द्वारा संबोधित किया गया है, जिसे मैंने ऊपर जोड़ा है। इस मामले में लब्बोलुआब यह है कि भले ही एक अनुरूपित URI API "RESTful" पर विचार करने के लिए अपर्याप्त है, अगर आप चाहते हैं कि आपका सिस्टम वास्तव में "RESTful" हो और आप HTTP और URI का उपयोग कर रहे हैं, तो आप इसके माध्यम से पदानुक्रमित डेटा की पहचान नहीं कर सकते हैं क्वेरी स्ट्रिंग क्योंकि:
3.4 प्रश्न
क्वेरी घटक में गैर-पदानुक्रमित डेटा होता है
...यह उसके जैसा आसान है।
2) एक ग्राहक के दृष्टिकोण से समझने की क्षमता के मामले में प्रत्येक के लिए पेशेवरों और विपक्ष क्या हैं, और डिजाइनर के दृष्टिकोण से स्थिरता है।
पहले दो के "पेशेवरों" यह है कि वे सही रास्ते पर हैं । तीसरे का "विपक्ष" यह है कि यह गलत तरीके से सपाट प्रतीत होता है।
जहां तक आपकी समझ और स्थिरता की चिंताएं हैं, वे निश्चित रूप से व्यक्तिपरक हैं और क्लाइंट डेवलपर की समझ के स्तर और डिजाइनर के डिजाइन चॉप्स पर निर्भर करते हैं। यूआरआई विनिर्देश इस बात का पक्का जवाब है कि यूआरआई को किस तरह से प्रारूपित किया जाना चाहिए। पदानुक्रमित डेटा को पथ पर और पथ मापदंडों के साथ दर्शाया जाना चाहिए। गैर-पदानुक्रमित डेटा को क्वेरी में दर्शाया जाना चाहिए। टुकड़ा अधिक जटिल है, क्योंकि इसके शब्दार्थ विशेष रूप से अनुरोध किए जा रहे मीडिया प्रकार पर निर्भर करते हैं। इसलिए आपके प्रश्न के "समझ" के घटक को संबोधित करने के लिए, मैं वास्तव में आपके पहले दो यूआरआई जो कह रहा हूं, उसका अनुवाद करने का प्रयास करेंगे। फिर, मैं यह दर्शाने का प्रयास करूँगा कि आप जो कहते हैं, आप मान्य यूआरआई के साथ पूरा करने की कोशिश कर रहे हैं।
अपने शब्दार्थ यूआरआई का उनके अर्थ अर्थ में अनुवाद,
/myservice/api/v1/grandparents/{grandparentID}/parents/children?search={text}
यह दादा-दादी के माता-पिता के लिए कहता है, अपने बच्चे को खोजने के लिए search={text}
जो आपने अपने यूआरआई के साथ कहा है वह केवल सुसंगत है अगर एक दादा-दादी के भाई-बहनों की तलाश है। अपने "दादा-दादी, माता-पिता, बच्चों" के साथ आपने पाया "एक दादा-दादी" अपने माता-पिता के लिए एक पीढ़ी से ऊपर चले गए और फिर माता-पिता के बच्चों को देखकर "दादा-दादी" की पीढ़ी में वापस आ गए।
/myservice/api/v1/parents/{parentID}/children?search={text}
यह कहता है कि {पेरेंटिड} द्वारा पहचाने गए अभिभावक के लिए, उनके बच्चे को खोजें कि ?search={text}
यह वही है जो आप चाहते हैं के लिए सही है, और यह माता-पिता-> बाल संबंध का प्रतिनिधित्व करता है जो संभवतः आपके संपूर्ण एपीआई को मॉडल करने के लिए उपयोग किया जा सकता है। इसे इस तरह से मॉडल करने के लिए, ग्राहक पर यह मानने के लिए कि उसे "दादा-दादी" कहा जाता है, के लिए बोझ रखा गया है, कि उनके पास मौजूद आईडी और परिवार के ग्राफ के हिस्से के बीच अप्रत्यक्ष रूप से एक परत है। "दादा-दादी" द्वारा "बच्चे" को खोजने के लिए, आप अपनी /parents/{parentID}/children
सेवा को कॉल कर सकते हैं और फिर वापस आने वाले बच्चे की खोज कर सकते हैं, अपने बच्चों को अपने व्यक्ति पहचानकर्ता के लिए खोज सकते हैं।
यूआरआई के रूप में अपनी आवश्यकताओं का कार्यान्वयन
यदि आप एक अधिक विलक्षण संसाधन पहचानकर्ता को मॉडल करना चाहते हैं जो पेड़ पर चल सकता है, तो मैं कई तरीकों के बारे में सोच सकता हूं जिन्हें आप पूरा कर सकते हैं।
1) पहले एक, मैं पहले से ही करने के लिए तैयार है। एक समग्र संरचना के रूप में "पीपल" के ग्राफ का प्रतिनिधित्व करते हैं। प्रत्येक व्यक्ति को अपने माता-पिता के पथ के माध्यम से इसके ऊपर की पीढ़ी का और इसके नीचे के बच्चों के माध्यम से एक पीढ़ी का संदर्भ है।
/Persons/Joe/Parents/Mother/Parents
जो जो के दादा दादी को हथियाने का एक तरीका होगा।
/Persons/Joe/Parents/Parents
जो के दादा-दादी के सभी को हथियाने का एक तरीका होगा।
/Persons/Joe/Parents/Parents?id={Joe.GrandparentID}
आपके हाथ में पहचानकर्ता होने वाले जो के दादा-दादी को पकड़ लेगा।
और ये सभी समझ में आएंगे (ध्यान दें कि "माता-पिता / माता-पिता / माता-पिता / माता-पिता" पैटर्न में शाखा की पहचान की कमी के कारण सर्वर पर कार्य करने के लिए कार्य के आधार पर यहां एक प्रदर्शन जुर्माना हो सकता है।) आप भी होने से लाभ उठाते हैं। पीढ़ियों की किसी भी मनमानी संख्या का समर्थन करने की क्षमता। यदि, किसी कारण से, आप 8 पीढ़ियों को देखना चाहते हैं, तो आप इस का प्रतिनिधित्व कर सकते हैं
/Persons/Joe/Parents/Parents/Parents/Parents/Parents/Parents/Parents/Parents?id={Joe.NotableAncestor}
लेकिन यह इस डेटा का प्रतिनिधित्व करने के लिए दूसरे प्रमुख विकल्प की ओर जाता है: एक पथ पैरामीटर के माध्यम से।
2) "पदानुक्रम को क्वेरी करने के लिए" पथ मापदंडों का उपयोग करें। आप उपभोक्ताओं पर बोझ को कम करने में मदद करने के लिए निम्नलिखित संरचना विकसित कर सकते हैं और अभी भी एक एपीआई है जो समझ में आता है।
147 पीढ़ियों को देखने के लिए, पथ मापदंडों के साथ इस संसाधन पहचानकर्ता का प्रतिनिधित्व करना आपको करने की अनुमति देता है
/Persons/Joe/Parents;generations=147?id={Joe.NotableAncestor}
अपने महान दादा-दादी से जो का पता लगाने के लिए, आप ग्राफ को जे की ईद के लिए कई पीढ़ियों तक ज्ञात कर सकते हैं।
/Persons/JoesGreatGrandparent/Children;generations=3?id={Joe.Id}
इन दृष्टिकोणों के साथ ध्यान देने की प्रमुख बात यह है कि पहचानकर्ता और अनुरोध में अधिक जानकारी के बिना, आपको यह उम्मीद करनी चाहिए कि पहला यूआरआई एक व्यक्ति 147 पीढ़ियों को जो से पहचान कर रहा है। आपको दूसरे को पुनः प्राप्त करने की उम्मीद करनी चाहिए। यह मान लें कि आप वास्तव में जो चाहते हैं, वह आपके कॉलिंग क्लाइंट के लिए नोड के पूरे सेट और रूट पर्सन और आपके यूआरआई के अंतिम संदर्भ के बीच उनके संबंधों को फिर से प्राप्त करने में सक्षम होना है। आप उसी URI के साथ (कुछ अतिरिक्त सजावट के साथ) कर सकते हैं और text/vnd.graphviz
आपके अनुरोध पर एक एक्सेप्ट सेट कर सकते हैं, जो .dot
ग्राफ प्रतिनिधित्व के लिए IANA पंजीकृत मीडिया प्रकार है । इसके साथ ही, URI को बदल दें
/Persons/Joe/Parents;generations=147?id={Joe.NotableAncestor.Id}#directed
HTTP रिक्वेस्ट हैडर के साथ
Accept: text/vnd.graphviz
और आपके पास क्लाइंट्स का स्पष्ट रूप से संवाद हो सकता है कि वे जो और 147 पीढ़ियों के बीच जेनरल पदानुक्रम के निर्देशित ग्राफ को चाहते हैं, जहां 147 वीं पैतृक पीढ़ी में एक व्यक्ति जो जो के "उल्लेखनीय पूर्वज" के रूप में पहचाना जाता है।
यदि पाठ / vnd.graphviz के खंडित होने के लिए कोई पूर्व-परिभाषित शब्दार्थ है, तो मैं अनिश्चित हूं, मुझे निर्देश की तलाश में कोई नहीं मिला। यदि उस मीडिया प्रकार में वास्तव में पूर्व-परिभाषित टुकड़े की जानकारी है, तो एक अनुरूप यूआरआई बनाने के लिए इसके शब्दार्थों का पालन किया जाना चाहिए। लेकिन, यदि उन शब्दार्थों को पूर्व-परिभाषित नहीं किया जाता है, तो यूआरआई विनिर्देश बताता है कि खंड पहचानकर्ता के शब्दार्थ अप्रतिबंधित हैं और इसके बजाय सर्वर द्वारा परिभाषित किया गया है, जो इस उपयोग को मान्य बनाता है।
3) आपके संसाधन पर "फ़िल्टरिंग" के अलावा क्वेरी स्ट्रिंग्स वास्तव में किस लिए उपयोग की जाती हैं? यदि आप पहले दृष्टिकोण के साथ जाते हैं, तो फ़िल्टर पैरामीटर URI में ही क्वेरी स्ट्रिंग पैरामीटर के बजाय पथ पैरामीटर के रूप में एम्बेडेड होता है।
मेरा मानना है कि मैंने पहले ही इसे अच्छी तरह से मार डाला है, लेकिन क्वेरी स्ट्रिंग्स "फ़िल्टरिंग" संसाधनों के लिए नहीं हैं। वे गैर-पदानुक्रमित डेटा से आपके संसाधन की पहचान करने के लिए हैं । यदि आपने जाकर अपने पदानुक्रम को अपने रास्ते से नीचे गिरा दिया है
/person/{id}/children/
और आप एक विशिष्ट बच्चे या बच्चों के एक विशिष्ट समूह की पहचान करना चाहते हैं, तो आप कुछ विशेषता का उपयोग करेंगे जो उस सेट पर लागू होते हैं जिसे आप पहचान रहे हैं और इसे क्वेरी के अंदर शामिल करें।