इसके लिए सही HTTP स्टेटस कोड क्या है: "इस एपीआई के संस्करण को बंद कर दिया गया है"?


13

मेरे पास एक RESTful API है। इसके 3 संस्करण हैं: v1, v2 और v3। मैं v4 प्रकाशित करने वाला हूं, और हमने v1 को बंद करने का फैसला किया है, जिसका अर्थ है कि सभी अनुरोध http://example.com/v1/resourceविफल हो जाएंगे, लेकिन http://example.com/v2/resourceकाम करना जारी रहेगा।

विफलता को इंगित करने का उपयुक्त तरीका क्या है? मैंने एक 410 GONEस्थिति कोड का उपयोग करने पर विचार किया , लेकिन यह दर्शाता है कि संसाधन उपलब्ध नहीं है। संसाधन संभावना आईएस अभी भी उपलब्ध है, हालांकि, केवल इसे एक अलग तरीके से अनुरोध किया जाना चाहिए।

मैंने एक सामान्य 400स्थिति कोड भी माना , लेकिन यह अजीब भी था। क्या इसके लिए एक मानक उत्तर है?


API विफलता के लिए कोई HTTP स्थिति कोड नहीं है क्योंकि API का HTTP से कोई लेना-देना नहीं है। आप कहते हैं, संसाधन अभी भी उपलब्ध है, लेकिन इसके लिए अलग तरीके से अनुरोध किया जाना चाहिए, REST में, यही संसाधन उपलब्ध नहीं है, इसलिए, यह उपलब्ध नहीं है।
रोब

जवाबों:


11

वहाँ एक मानक नहीं लगता है।

StackOverflow का जवाब 410 GONE की ओर है, लेकिन मुझे लगता है कि 301 MOVED परमानेंटली अधिक उपयुक्त है।

सही विकल्प बनाने के लिए, हमें आपके विशिष्ट मामले को देखना होगा। यदि आपका लक्ष्य एपीआई v1 के लिए किए जा रहे सभी कॉलों को आगे कोई कार्रवाई किए बिना विफल रहता है, तो 410 गोन इसके लिए काम करता है। यदि आप कुछ निरंतरता चाहते हैं, जैसे कि क्लाइंट को आपके एपीआई के एक नए संस्करण में पुनर्निर्देशित करना जहां उनकी कॉल सफल हो सकती है, 3XX काम करता है, लेकिन आप किसे चुनते हैं? मुझे लगता है कि अगर आप API v1 को बंद करने की कोशिश कर रहे हैं, तो 301 मूव्ड परमानेंटली 303 SEE OTHER से बेहतर इंगित करने में मदद करता है, क्योंकि 301 बताता है कि भविष्य के सभी अनुरोध नए url को किए जाने चाहिए, जबकि 303 यह संकेत नहीं देता है कि यह स्थिति है या नहीं। स्थायी।

मैं इस तरह से API की इंजीनियरिंग करने की सलाह दूंगा कि प्रत्येक संस्करण पीछे की ओर संगत रहे, ताकि 301 MOVED परमानेंटली पारदर्शी रूप से आपके API को जीवंत बनाए रखें और जब भी आप नए API संस्करणों के लिए नए समापन बिंदु जोड़ते हैं, तो अद्यतित रहेंगे। मुझे लगता है कि आप वैसे भी करने की कोशिश कर रहे हैं।

HTTP स्थिति कोड

HTTP स्थिति कोड 302 मूल रूप से बहुत व्यापक था और इस तरह गलत तरीके से लागू / उपयोग किया गया, इसलिए 303 और 307 को 302 के दोहरे उपयोग मामले के बीच अंतर करने के लिए बनाया गया था। कुछ API अन्य उद्देश्यों के लिए 303 का उपयोग करते हैं।

301 जारी स्थायी रूप से - 301 (स्थानांतरित स्थायी रूप से) स्थिति कोड इंगित करता है कि लक्ष्य संसाधन को एक नया स्थायी यूआरआई सौंपा गया है और इस संसाधन के किसी भी भविष्य के संदर्भ को संलग्न यूआरआई में से एक का उपयोग करना चाहिए।

302 ध्वनि - 302 (मिला) स्थिति कोड इंगित करता है कि लक्ष्य संसाधन एक अलग URI के तहत अस्थायी रूप से रहता है। चूंकि पुनर्निर्देशन को मौके पर बदल दिया जा सकता है, ग्राहक को भविष्य के अनुरोधों के लिए प्रभावी अनुरोध URI का उपयोग जारी रखना चाहिए।

303 SEE OTHER - GET अनुरोध के लिए 303 प्रतिक्रिया इंगित करती है कि मूल सर्वर में लक्ष्य संसाधन का प्रतिनिधित्व नहीं है जिसे HTTP पर सर्वर द्वारा स्थानांतरित किया जा सकता है। हालाँकि, स्थान फ़ील्ड मान एक ऐसे संसाधन को संदर्भित करता है जो लक्ष्य संसाधन का विवरणात्मक होता है, जैसे कि उस पर एक पुनर्प्राप्ति अनुरोध करने से अन्य संसाधन को एक प्रतिनिधित्व मिल सकता है जो प्राप्तकर्ताओं के लिए उपयोगी है बिना यह अर्थ लगाए कि यह मूल लक्ष्य संसाधन का प्रतिनिधित्व करता है।

410 चला गया - 410 ( गया ) स्थिति कोड इंगित करता है कि लक्ष्य संसाधन तक पहुंच मूल सर्वर पर उपलब्ध नहीं है और यह स्थिति स्थायी होने की संभावना है। यदि मूल सर्वर को पता नहीं है, या यह निर्धारित करने के लिए कोई सुविधा नहीं है कि क्या स्थिति स्थायी है या नहीं, इसके बजाय स्थिति कोड 404 (नहीं मिला) का उपयोग किया जाना चाहिए।

मौजूदा API इसे कैसे संभालते हैं?

शायद आप Google के Youtube API से एक पेज ले सकते हैं :

जब API अनुरोध विफल हो जाता है, तो YouTube एक HTTP 4xx या 5xx प्रतिक्रिया कोड लौटाएगा, जो विफलता के साथ-साथ एक XML प्रतिक्रिया की पहचान करता है जो कि विफलता के कारण त्रुटि के बारे में अधिक विशिष्ट जानकारी प्रदान करता है। प्रत्येक त्रुटि के लिए, XML प्रतिक्रिया में एक डोमेन तत्व, कोड तत्व और संभवतः एक स्थान तत्व शामिल होता है।

आगे की पढाई:


2
301 खतरनाक लगता है। यह स्वत: रीडायरेक्ट को ऐसे स्थान पर ले जाएगा जो एक ही विहित अर्थ नहीं हो सकता है।
ब्रैंडन यारब्रॉट

इनपुट की सराहना करें। सभी 3XX कोड इंगित करते हैं कि क्लाइंट को लोकेशन हेडर में वैकल्पिक यूआरएल की आपूर्ति करके एक अतिरिक्त कार्रवाई (रीडायरेक्ट) करनी होगी। यह ध्यान रखना दिलचस्प है कि प्रत्येक कोड में थोड़ा अलग रीडायरेक्ट व्यवहार होता है; 303 GST के रूप में एक POST को नए स्थान पर पुनर्निर्देशित करेगा। मैं निश्चित रूप से अधिक जानकारी के साथ इस उत्तर को अपडेट कर रहा हूं।
पेरी

1

पुनर्निर्देशन उन संसाधनों के लिए बहुत अच्छा है जो स्थानांतरित हो गए हैं। 301 स्थायी रीडायरेक्ट के बजाय (जो एपीआई परिवर्तनों के बिना नाम बदलेगा), मैं एक 303 "अन्य देखें" पुनर्निर्देशन का उपयोग करेगा।


0

पुनर्निर्देशन के बिना अभी भी विरासत का समर्थन करने की आवश्यकता है? यहां तक ​​कि अगर आप अभी भी इसका समर्थन कर रहे हैं और इसे अभी भी लागू किया गया है, तो 501 आपकी स्थिति में हाथ बंटाता है। वे जानते हैं कि अभी भी इसका इस्तेमाल कर सकते हैं, जबकि रैंडम में v1 के लिए 501 देखा जाएगा।

10.5.2 501 लागू नहीं किया गया

सर्वर अनुरोध को पूरा करने के लिए आवश्यक कार्यक्षमता का समर्थन नहीं करता है। यह उचित प्रतिक्रिया है जब सर्वर अनुरोध विधि को नहीं पहचानता है और किसी भी संसाधन के लिए समर्थन करने में सक्षम नहीं है।

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


0

मैं एक संदेश के साथ 503 का उपयोग करूंगा कि सेवा अनुपलब्ध है और नए संस्करण का उपयोग करने के लिए इंगित करें। यह संदेश 50% कॉल के लिए वापस किया जा सकता है और समय में धीरे-धीरे 100% तक बढ़ सकता है।

पारदर्शी प्रवास के लिए, मैं 308 का उपयोग करूंगा - स्थायी पुनर्निर्देशन, क्योंकि यह विधि 301 के विपरीत क्रिया (POST POST होगी) को संशोधित नहीं करती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.