यह एक अच्छा और पेचीदा प्रश्न है। URI डिजाइन का विषय एक ही समय में REST API का सबसे प्रमुख हिस्सा है और इसलिए, उस API के उपयोगकर्ताओं के लिए एक संभावित दीर्घकालिक प्रतिबद्धता है ।
चूंकि एक अनुप्रयोग का विकास और, कुछ हद तक, इसका एपीआई जीवन का एक तथ्य है और यह एक प्रोग्रामिंग भाषा की तरह प्रतीत होता है जटिल उत्पाद के विकास के समान है, यूआरआई डिजाइन में कम प्राकृतिक बाधाएं होनी चाहिए और इसे संरक्षित किया जाना चाहिए समय के साथ । एप्लिकेशन और API का जीवनकाल जितना लंबा होगा, एप्लिकेशन और API के उपयोगकर्ताओं के लिए प्रतिबद्धता उतनी ही अधिक होगी।
दूसरी ओर, जीवन का एक और तथ्य यह है कि एपीआई के माध्यम से उपभोग किए जाने वाले सभी संसाधनों और उनके पहलुओं को दूर करना कठिन है। सौभाग्य से, पूरे एपीआई को डिज़ाइन करना आवश्यक नहीं है जो कि एपोकैलिप्स तक उपयोग किया जाएगा । यह सभी संसाधन अंत-बिंदुओं और हर संसाधन और संसाधन उदाहरण की एड्रेसिंग स्कीम को सही ढंग से परिभाषित करने के लिए पर्याप्त है।
समय के साथ आपको प्रत्येक विशेष संसाधन में नए संसाधनों और नई विशेषताओं को जोड़ने की आवश्यकता हो सकती है, लेकिन एक विशेष संसाधन तक पहुंचने के लिए एपीआई उपयोगकर्ता जिस विधि का पालन करते हैं, उसे संसाधन पते की योजना के सार्वजनिक होने और इसलिए अंतिम रूप से परिवर्तित नहीं होना चाहिए।
यह विधि HTTP क्रिया शब्दार्थ पर लागू होती है (जैसे PUT को हमेशा अद्यतन / प्रतिस्थापित करना चाहिए) और HTTP स्थिति कोड जो पहले के एपीआई संस्करणों में समर्थित हैं (उन्हें काम करना जारी रखना चाहिए ताकि एपीआई क्लाइंट जो मानव हस्तक्षेप के बिना काम कर चुके हैं, उन्हें काम जारी रखने में सक्षम होना चाहिए। उसके जैसा)।
इसके अलावा, यूआरआई में एपीआई संस्करण एम्बेड करने की अवधारणा को बाधित है, क्योंकि आवेदन राज्य के इंजन के रूप में हाइपरमीडिया एक संसाधन का पता / यूआरआई कि समय के साथ बदल जाएगा होने से (रॉय टी Fieldings पीएचडी शोध प्रबंध में कहा गया है), मुझे लगता है कि निष्कर्ष निकालना होगा एपीआई संस्करणों को लंबे समय तक संसाधन यूआरआई में नहीं रखा जाना चाहिए जिसका अर्थ है कि संसाधन यूआरआई जो एपीआई उपयोगकर्ताओं पर निर्भर कर सकते हैं, वे परमिटलिंक होने चाहिए ।
निश्चित रूप से, एपीआई संस्करण को आधार यूआरआई में एम्बेड करना संभव है , लेकिन केवल एपीआई क्लाइंट के डिबगिंग जैसे उचित और प्रतिबंधित उपयोगों के लिए जो नए एपीआई संस्करण के साथ काम करता है। इस तरह के संस्करण एपीआई केवल सीमित समय के लिए और एपीआई उपयोगकर्ताओं के सीमित समूहों के लिए उपलब्ध होने चाहिए (जैसे बंद शर्त के दौरान)। अन्यथा, आप अपने आप को प्रतिबद्ध करते हैं जहां आपको नहीं होना चाहिए।
एपीआई संस्करणों के रखरखाव के बारे में कुछ विचार जो उन पर समाप्ति की तारीख है। आमतौर पर वेब सेवाओं (जावा, .NET, PHP, पर्ल, रेल्स, आदि) को लागू करने के लिए उपयोग किए जाने वाले सभी प्रोग्रामिंग प्लेटफॉर्म / भाषाएं आधार URI के लिए वेब सेवा एंड-पॉइंट (एस) के आसान बंधन की अनुमति देती हैं। इस तरह विभिन्न एपीआई संस्करणों में अलग-अलग फ़ाइलों / वर्गों / विधियों का संग्रह इकट्ठा करना और रखना आसान है ।
एपीआई उपयोगकर्ताओं पीओवी से, एक विशेष एपीआई संस्करण के साथ काम करना और बांधना आसान है, जब यह स्पष्ट है लेकिन केवल सीमित समय के लिए, यानी विकास के दौरान।
एपीआई अनुरक्षक POV से, स्रोत नियंत्रण प्रणालियों का उपयोग करके समानांतर में विभिन्न एपीआई संस्करणों को बनाए रखना आसान होता है जो मुख्य रूप से (स्रोत कोड) संस्करण की सबसे छोटी इकाई के रूप में फाइलों पर काम करते हैं।
हालांकि, URI में स्पष्ट रूप से दिखाई देने वाले API संस्करणों में एक चेतावनी है: एक व्यक्ति इस दृष्टिकोण पर भी आपत्ति जता सकता है क्योंकि API इतिहास URI डिजाइन में दृश्यमान / अपारदर्शी हो जाता है और इसलिए समय के साथ परिवर्तन के लिए प्रवण होता है जो REST के दिशानिर्देशों के विरुद्ध जाता है। मैं सहमत हूँ!
इस उचित आपत्ति के चारों ओर जाने का तरीका, संस्करण रहित एपीआई आधार URI के तहत नवीनतम एपीआई संस्करण को लागू करना है। इस मामले में, एपीआई क्लाइंट डेवलपर्स या तो चुन सकते हैं:
नवीनतम के खिलाफ विकसित करना (अपने आप को एप्लिकेशन को बनाए रखने के लिए इसे अंतिम एपीआई परिवर्तनों से बचाने के लिए जो उनके बुरी तरह से डिज़ाइन किए गए एपीआई क्लाइंट को तोड़ सकते हैं )।
एपीआई के एक विशिष्ट संस्करण के लिए बाध्य करें (जो स्पष्ट हो जाता है) लेकिन केवल एक सीमित समय के लिए
उदाहरण के लिए, अगर एपीआई v3.0 नवीनतम एपीआई संस्करण है, तो निम्नलिखित दो उपनाम होने चाहिए (यानी सभी अनुरोधों के लिए पहचान के अनुसार व्यवहार करें):
http: // shonzilla / api / customers / 1234
http: // shonzilla / api /v3.0 / ग्राहक / 1234
http: // shonzilla / api / v3 / ग्राहक / 1234
इसके अलावा, एपीआई क्लाइंट जो अभी भी पुराने एपीआई को इंगित करने का प्रयास करते हैं, उन्हें नवीनतम पिछले एपीआई संस्करण का उपयोग करने के लिए सूचित किया जाना चाहिए, अगर वे जिस एपीआई संस्करण का उपयोग कर रहे हैं वह अप्रचलित है या अब समर्थित नहीं है । इसलिए किसी भी अप्रचलित URI को इस तरह से एक्सेस करना:
http: // shonzilla / api /v2.2 / ग्राहक / 1234
http: // shonzilla / api /v2.0 / ग्राहक / 1234
http: // shonzilla / api / v2 / customers / 1234
http: // shonzilla / api /v1.1 / ग्राहक / 1234
http: // shonzilla / api / v1 / ग्राहकों / 1234
30x HTTP स्थिति कोडों में से किसी को भी वापस करना चाहिए जो पुनर्निर्देशन को इंगित करता है जो Location
HTTP हेडर के साथ संयोजन के रूप में उपयोग किया जाता है जो कि संसाधन URI के उपयुक्त संस्करण पर पुनर्निर्देशित करता है जो कि यह बने रहते हैं:
http: // shonzilla / API / ग्राहकों / 1234
कम से कम दो पुनर्निर्देशन HTTP स्थिति कोड हैं जो API संस्करण परिदृश्यों के लिए उपयुक्त हैं:
301 स्थायी रूप से यह दर्शाता है कि अनुरोधित URI वाला संसाधन स्थायी रूप से दूसरे URI में ले जाया जाता है (जिसमें एक संसाधन उदाहरण पारलिंक होना चाहिए जिसमें API संस्करण जानकारी नहीं है)। इस स्थिति कोड का उपयोग अप्रचलित / असमर्थित एपीआई संस्करण को दर्शाने के लिए किया जा सकता है, जो एपीआई क्लाइंट को सूचित करता है कि एक संस्करणित संसाधन यूआरआई को रिसोर्स पर्मलिंक से बदल दिया गया है ।
302 यह दर्शाता है कि अनुरोधित संसाधन अस्थायी रूप से किसी अन्य स्थान पर स्थित है, जबकि अनुरोधित URI अभी भी समर्थित हो सकता है। यह स्थिति कोड तब उपयोगी हो सकता है जब संस्करण-आधारित URI अस्थायी रूप से अनुपलब्ध हो और यह अनुरोध पुनर्निर्देशन पते (जैसे APRI संस्करण के साथ URI की ओर इशारा करते हुए) का उपयोग करके दोहराया जाना चाहिए और हम ग्राहकों को इसका उपयोग करते रहने के लिए कहना चाहते हैं (यानी पर्मालिंक्स)।
अन्य परिदृश्य HTTP 1.1 विनिर्देश के पुनर्निर्देशन 3xx अध्याय में पाए जा सकते हैं