जब मैं इसे लागू करने की कोशिश करता हूं तो मेरे दिमाग में REST संघर्ष से संबंधित कई अवधारणाएं हैं।
मेरे पास REST-ful बैक-एंड API सिस्टम है जो व्यावसायिक तर्क रखता है, और एक वेब अनुप्रयोग जो UI प्रदान करता है। REST के बारे में विभिन्न संसाधनों से (विशेष रूप से, REST in Practice: Hypermedia and Systems Architecture ) मुझे पता है कि मुझे अपनी संस्थाओं के कच्चे पहचानकर्ताओं को उजागर नहीं करना चाहिए, बल्कि इसके साथ हाइपरलिंक वापस करना चाहिए rel="self"
।
उदाहरण पर विचार करें। REST एपि में एक संसाधन है जो एक व्यक्ति को लौटाता है:
<Person>
<Links>
<Link rel="self" href="http://my.rest.api/api/person/1234"/>
</Links>
<Pets>
<Link rel="pet" href="http://my.rest.api/api/pet/678"/>
</Pets>
</Person>
समस्या वेब अनुप्रयोग के साथ उत्पन्न होती है। मान लेते हैं कि यह एक पृष्ठ लौटाता है जिसमें ब्राउज़रों के लिए हाइपरलिंक है:
<body class="person">
<p>
<a href="http://my.web.app/pet/???????" />
</p>
</body>
मुझे href
विशेषता में क्या डालना चाहिए ? उपयोगकर्ता द्वारा लक्ष्य पृष्ठ खोलने पर इकाई पाने में सक्षम होने के लिए मैं वेब एप्लिकेशन में एपीआई इकाई URL कैसे रख सकता हूं?
आवश्यकताएं परस्पर विरोधी लगती हैं:
- हाइपरलिंक
href
को वेब एप्लिकेशन पर ले जाना चाहिए क्योंकि यह UI होस्ट करने वाला सिस्टम है href
इकाई के कुछ आईडी होना चाहिए क्योंकि वेब अनुप्रयोग इकाई को संबोधित करने के लिए जब लक्ष्य पृष्ठ खुल जाता है में सक्षम होना चाहिए- उल्लेखित पुस्तक कहती है कि वेब ऐप को REST URL को पेरेस / कंस्ट्रक्शन नहीं करना चाहिए क्योंकि यह REST-ful नहीं है
यूआरआई उपभोक्ताओं के लिए अपारदर्शी होना चाहिए। केवल यूआरआई जारीकर्ता जानता है कि इसकी व्याख्या कैसे करें और इसे एक संसाधन में कैसे मैप करें।
इसलिए, मैं सिर्फ 1234
एपीआई प्रतिक्रिया URL से नहीं ले सकता क्योंकि एक RESTful ग्राहक के रूप में मुझे इसका इलाज करना चाहिए जैसे कि यह कुछ ऐसा था http://my.rest.api/api/AGRIDd~ryPQZ^$RjEL0j
। दूसरी ओर, मुझे कुछ URL देना होगा जो मेरे वेब ऐप की ओर जाता है और यह ऐप के लिए किसी भी तरह से एपीआई के मूल URL को पुनर्स्थापित करने और एपीआई संसाधनों तक पहुंचने के लिए उस URL का उपयोग करने के लिए पर्याप्त है।
सबसे सरल तरीका शायद संसाधनों के एपीआई यूआरएल को उनके स्ट्रिंग पहचानकर्ता के रूप में उपयोग करना है। लेकिन वेब पेज यूआरएल की तरह http://my.web.app/person/http%3A%2F%2Fmy.rest.api%2Fapi%2Fperson%2F1234
बदसूरत हैं।
यह सब एक डेस्कटॉप ऐप या सिंगल-पेज जावास्क्रिप्ट ऐप के लिए काफी आसान लगता है। चूँकि वे निरंतर रहते हैं, वे केवल जीवन भर के लिए सेवा की वस्तुओं के साथ यूआरएल को स्मृति में रख सकते हैं और आवश्यकता पड़ने पर उनका उपयोग कर सकते हैं।
एक वेब ऐप के साथ मैं कई तरीकों की कल्पना कर सकता हूं, लेकिन सभी अजीब लगते हैं:
- API URL में होस्ट को बदलें और केवल परिणाम रखें। भारी नकारात्मक पक्ष यह है कि एपीआई जो भी URL उत्पन्न करता है उसे संभालने के लिए वेब एप्लिकेशन की आवश्यकता होती है, जिसका अर्थ है राक्षसी युग्मन। इसके अलावा, यह फिर से Restful नहीं है, क्योंकि मेरा वेब ऐप URL की व्याख्या करना शुरू कर देता है।
- लिंक के साथ REST API में कच्ची आईडी को उजागर करें, उन्हें वेब ऐप के URL बनाने के लिए उपयोग करें, और फिर API में आवश्यक संसाधनों को खोजने के लिए वेब ऐप सर्वर पर आईडी का उपयोग करें। यह बेहतर है, लेकिन वेब ऐप सर्वर के प्रदर्शन को प्रभावित करेगा क्योंकि वेब ऐप को ब्राउज़र से किसी भी अनुरोध को संभालने के लिए किसी न किसी रूप के गेट-बाय-आईडी अनुरोधों की एक श्रृंखला जारी करने वाले आरईएसटी सेवा नेविगेशन से गुजरना होगा। कुछ नेस्टेड संसाधन के लिए यह महंगा हो सकता है।
- सभी स्टोर
self
यूआरएल एक लगातार (DB?) वेब अनुप्रयोग सर्वर पर मानचित्रण में API द्वारा दिए। उनके लिए कुछ आईडी बनाएं, वेब एप्लिकेशन पेज URL बनाने के लिए आईडी और REST सेवा संसाधनों के URL प्राप्त करने के लिए उपयोग करें। यानी मैंhttp://my.rest.api/pet/678
URL को एक नई कुंजी के साथ रखता हूं , कहता हूं3
, और वेब पेज URL को जनरेट करता हूंhttp://my.web.app/pet/3
। यह किसी तरह का HTTP कैश कार्यान्वयन जैसा दिखता है। मुझे पता नहीं क्यों, लेकिन यह मुझे अजीब लगता है।
या क्या यह सब मतलब है कि RESTful API वेब एप्लिकेशन के लिए बैकएंड के रूप में सेवा नहीं कर सकता है?