RESTful API और i18n: प्रतिक्रिया कैसे डिज़ाइन करें?


15

हम एक RESTful API डिज़ाइन कर रहे हैं जो मुख्य रूप से किसी एकल क्लाइंट की जरूरतों को पूरा करने के लिए है। इसकी विशेष परिस्थितियों के कारण, इस ग्राहक को यथासंभव कम अनुरोध करने पड़ते हैं।

एपीआई अनुरोधों में स्वीकार-भाषा के हेडर के माध्यम से i18n को संभालता है। यह उन सभी चीजों के लिए काम करता है जो क्लाइंट को केवल एक सुविधा को छोड़कर करने की आवश्यकता होती है, जिसमें क्लाइंट को सभी उपलब्ध स्थानों में एक एकल समापन बिंदु के अनुरोध की प्रतिक्रियाओं को संग्रहीत करने की आवश्यकता होती है।

क्या हम किसी तरह एपीआई को डिजाइन कर सकते हैं जो क्लाइंट को एक एकल अनुरोध के साथ और एक सुसंगत, अच्छी तरह से संरचित RESTful एपीआई डिजाइन को तोड़ने के बिना यह सब जानकारी प्राप्त करने की अनुमति देता है?

अब तक हमने जिन विकल्पों पर विचार किया है:

  • एक्सेप्ट-लैंग्वेज हेडर में कई स्थानों को शामिल करने और प्रतिक्रिया में सभी अनुरोधित स्थानों के लिए स्थानीयकृत संस्करण जोड़ने की अनुमति है, प्रत्येक को इसके आईएसओ 639-1 भाषा कोड द्वारा कुंजी के रूप में पहचाना गया है।
  • उस समापन बिंदु पर "all_languages ​​= true" पैरामीटर जैसा कुछ बनाना और प्रतिक्रिया में सभी उपलब्ध स्थानों के लिए स्थानीयकृत संस्करण वापस करना अगर वह पैरामीटर मौजूद है।
  • (यदि उपरोक्त में से कोई भी हमारे लिए काम नहीं करता है) क्लाइंट से सभी स्थानीयकृत संस्करणों को हथियाने के लिए कई अनुरोध करता है।

सबसे अच्छा विकल्प कौन सा है?

जवाबों:


22

आपने कई भाषाओं के लिए दो प्रभावी तरीकों का वर्णन किया है। या तो ठीक काम करना चाहिए। मैं अपने कोड के लिए स्पष्ट भाषा अनुरोध पैरामीटर चुनूंगा।

टीएल; डीआर बैकस्टोरी

एक स्वीकार भाषा हैडर है । ध्यान दें, Acceptनहीं Accepted। यह HTTP सामग्री बातचीत का एक मानक हिस्सा है। प्रतिक्रिया आमतौर पर एक सामग्री-भाषा सेट करती है शीर्ष लेख को वापस ।

Accept-Languageउद्घाटन बोली है, विकल्पों के एक सेट की पेशकश; Content-Languageवह संकल्प है, जिसमें बताया गया है कि किस भाषा को चुना गया। अधिकांश Content-Languageउत्तर एकल भाषा को लौटाते हैं, लेकिन प्रतिक्रिया भाषाओं की अल्पविराम से अलग सूची प्रदान करने का विकल्प है। आमतौर पर यह मिश्रित-सामग्री होगी, लेकिन ऐसा कोई कारण नहीं है कि यह कई असहमति के विकल्पों का संकेत न दे सके। यदि आप क्लाइंट को सभी उपलब्ध भाषाओं का अनुरोध करना चाहते हैं, तो पहले से ही वाइल्डकार्ड अनुरोध विकल्प है *

तो पहले से ही एक HTTP हैडर तंत्र है जिसका आप उपयोग कर सकते हैं। हालांकि, सावधान रहें कि आप एक वार्ता प्रक्रिया में गुल्लकिंग करेंगे जो अधिक बार संभावित विकल्पों की एक सरणी प्रस्तुत करता है, और एक ही विकल्प वापस मिलता है। आप "यहां विकल्पों की एक सूची है, इस भावना को स्थानांतरित कर देंगे, मुझे उन सभी को दे दो!" यदि आप इसके साथ ठीक हैं, तो आपको एक समाधान मिल गया है।

हालाँकि, HTTP हेडर में REST एपीआई मापदंडों को संकेत देने की उपयुक्तता के रूप में काफी बहस है। यह एक रेस्तरां में प्रवेश करने और वेटर या वेट्रेस के सामने आने के बजाय अपने विस्तृत ऑर्डर को होस्ट या माएटर डी 'को धुंधला करने जैसा है। यह काम कर सकता है, और अच्छी तरह से काम कर सकता है जैसे कि यदि मेज़बान पर निर्देशित आदेश पेय या ऐपेटाइज़र से संबंधित है - ऐसी चीजें जो होस्ट जल्दी से देख सकते हैं, या अपने सर्वर पर जल्दी से संवाद कर सकते हैं। लेकिन इसे प्रोटोकॉल के उल्लंघन के रूप में भी देखा जा सकता है, जिसे गलत स्तर / परत या गलत खिलाड़ी पर संबोधित किया जाता है।

एक दूसरा विकल्प एक स्पष्ट अनुरोध पैरामीटर होगा। आप सुझाव दें ?all_languages=true। यह अत्यधिक विशिष्ट लगता है। कुछ ऐसा है lang=en,fr,es(कई सूचीबद्ध भाषाओं की अनुमति दें) या lang=*या lang=all(हर उपलब्ध भाषा को निर्दिष्ट करें) अधिक सामान्य लगता है। यह URL या अनुरोध बॉडी में व्यक्त किया जा सकता है।

किसी भी तरह से, आपकी बहुभाषी प्रतिक्रिया को आसानी से रिटर्न किए गए JSON पेलोड में एन्कोड किया जा सकता है:

[ { "lang": "en", "content": "As Gregor Samsa awoke one morning..." },
  { "lang": "de", "content": "Als Gregor Samsa eines Morgens..." },
  ...
]

अंत में, इनमें से किसी भी दृष्टिकोण को आपके लिए अच्छा काम करना चाहिए। या तो एक "सुसंगत, अच्छी तरह से संरचित RESTful एपीआई डिजाइन के रूप में देखा जा सकता है।" यह निर्धारित करने के लिए कि कौन सा बेहतर है, ज्यादातर आपके दृष्टिकोण पर निर्भर करता है कि गुल्लक की उपयुक्तता पर (और सामान्य रूप से थोड़ा बदलकर) HTTP कंटेंट बातचीत हेडर।

मेरी अपनी प्राथमिकता एक एपीआई अनुरोध के बराबर भागों के रूप में हेडर और अन्य मापदंडों को रोकना नहीं है । स्पष्ट langया languageपैरामीटर मुझे साफ लगता है। लेकिन चूंकि HTTP क्रिया (जैसे GET, PUT, POST, PATCH, ...), शीर्ष लेख का हिस्सा है और भी महत्वपूर्ण करने के लिए / अनुरोध की व्याख्या के साथ intermixed, मैं मानता लिफाफा बनाम सामग्री भेद थोड़ा कृत्रिम और अस्पष्ट है। अधिकांश डिजाइन निर्णयों के साथ, वास्तविक विशेषज्ञ इसका अलग-अलग उत्तर देते हैं, और वाईएमएमवी।


उनकी प्रतिक्रिया बहुत शैक्षिक और सूचनात्मक रही है। धन्यवाद। एक्सेप्ट-नॉट-एक्सेप्टेड चीज को नोट करने के लिए भी धन्यवाद। यह हमारे कोड में सही है, लेकिन तब मैं पोस्ट लिखते समय उचित शब्द का उपयोग करने में विफल रहा। मैं इसे आगे के संदर्भों के लिए संशोधित करूंगा।
AMM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.