2012-12-12 15 views
5

मैं वर्तमान में एक वेब एपीआई बना रहा हूं और एक विशिष्ट परिदृश्य है कि मैं यह निर्धारित नहीं कर सकता कि कौन सी HTTP स्थिति कोड वापस लौटने के लिए सबसे उपयुक्त होगा।अंतिम संपर्क हटा नहीं सकता - क्या स्थिति स्थिति कोड है?

परिदृश्य

मैं एक "ग्राहक" संसाधन जो संपर्क संसाधनों का एक संग्रह का मालिक है।

invariant यह है कि एक ग्राहक के पास हमेशा कम से कम एक संपर्क होना चाहिए। इसलिए, यदि कोई संपर्क हटाने के लिए अनुरोध किया गया है और यह संपर्क दिए गए क्लाइंट के लिए अंतिम शेष संपर्क है, तो मुझे एक उचित HTTP प्रतिक्रिया वापस करने की आवश्यकता है जो यह दर्शाता है कि अनुरोध "अंतिम संपर्क को हटा नहीं सकता" के रूप में पूरा नहीं किया जा सकता है।

मेरे भावना इस बात का "4xx क्लायंट त्रुटि की '

मैं माना जाता है निम्नलिखित स्थिति कोड्स श्रेणी में आते हैं चाहिए:

400 गलत अनुरोध - मैं इस संभावना से इनकार किया है यह है के रूप में विशेष रूप से विकृत अनुरोध के संबंध में जिसमें सर्वर समझने में असमर्थ है।

405 विधि अनुमत नहीं - पहले यह उपयुक्त लगता है, लेकिन मुझे लगता है कि 405 इंगित करता है कि इस विधि को कभी अनुमति नहीं दी जानी चाहिए, हालांकि उपर्युक्त परिदृश्य केवल क्षणिक है। विचार?

40 9 संघर्ष - मैं इस दिशा में झुका रहा हूं, हालांकि इस कोड के लिए दिया गया सामान्य उदाहरण आम तौर पर एक समझौता अपवाद/संघर्ष संपादित करता है।

क्या किसी के पास इस परिदृश्य में मुझे जवाब देने के तरीके के बारे में कोई मार्गदर्शन है?

+0

'40 9' इस मामले में मेरा वोट प्राप्त करें, क्योंकि यह एक संघर्ष है जिसे उपयोगकर्ता हल कर सकता है। यह सामान्य उदाहरण है कि मेरे लिए कोई फर्क नहीं पड़ता, इस तरह के अन्य उदाहरण मौजूद हैं। '400' वास्तव में सही है, लेकिन '405' के लिए कुछ कहना है यदि आप वास्तविक 'DELETE' अनुरोधों का उपयोग करते हैं ... यदि नहीं, 40 9 मैं कहता हूं, लेकिन यदि आप करते हैं ... मैं आपकी दुविधा देखता हूं। – Wrikken

+0

हां, मैं यहां डेलेटी क्रिया का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि 405 इंगित करता है कि दिए गए संसाधन पर विधि को _never_ की अनुमति दी जानी चाहिए। –

उत्तर

7

कुंजी किसी विशेष स्थिति कोड का उपयोग होने पर ग्राहक और कैश पर अपेक्षाओं को देखना महत्वपूर्ण है।

10.4.1:

यहाँ कि को देखने के लिए उपयोगी होते हैं RFC2616 में से कुछ हिस्सा है। 400 खराब अनुरोध

दुर्भावनापूर्ण वाक्यविन्यास के कारण सर्वर द्वारा अनुरोध को समझा नहीं जा सका। ग्राहक को संशोधन के बिना अनुरोध दोहराना नहीं चाहिए।

यह इंगित करता है कि अनुरोध स्वयं पूरी तरह से गलत है - या तो वाक्य रचनात्मक रूप से या प्रोटोकॉल द्वारा। आपका विशिष्ट मामला वास्तव में एक एप्लिकेशन प्रोटोकॉल त्रुटि है, इसलिए यह वास्तव में उपयुक्त हो सकता है।

10.4.6। 405 विधि अनुमत नहीं

अनुरोध-रेखा में निर्दिष्ट विधि के लिए अनुरोध-रेखा में निर्दिष्ट विधि की अनुमति नहीं है। प्रतिक्रिया में अनुरोध किए गए संसाधन के लिए वैध विधियों की एक सूची वाले हेडर को अनुमति दें।

यह एक क्षणिक स्थिति कोड है। यदि DELETE विशेष रूप से संपर्क संसाधनों को संदर्भित करता है (उदा।, DELETE /contacts/D9DF5176-EEE4-4C70-8DA7-BA57B82027A8) तो यह शायद सबसे उपयुक्त स्थिति कोड है। हालांकि, यदि DELETE किसी भिन्न संसाधन या किसी क्वेरी के साथ संसाधन पर है (उदा।, DELETE /contacts?index=12), तो मैं 405 वापस नहीं लौटाउंगा। फिर फिर, मैं आमतौर पर क्वेरी के जैसा कुछ भी DELETE का उपयोग करने से साफ़ हो जाता हूं।

10.4.10। 40 9 संघर्ष

अनुरोध की वर्तमान स्थिति के साथ संघर्ष के कारण अनुरोध पूरा नहीं हो सका। यह कोड केवल उन परिस्थितियों में अनुमत है जहां यह अपेक्षा की जाती है कि उपयोगकर्ता संघर्ष को हल करने और अनुरोध को पुनः सबमिट करने में सक्षम हो सकता है। प्रतिक्रिया निकाय को उपयोगकर्ता के संघर्ष के स्रोत को पहचानने के लिए पर्याप्त जानकारी शामिल करनी चाहिए। आदर्श रूप में, प्रतिक्रिया इकाई में समस्या को ठीक करने के लिए उपयोगकर्ता या उपयोगकर्ता एजेंट के लिए पर्याप्त जानकारी शामिल होगी; हालांकि, यह संभव नहीं हो सकता है और इसकी आवश्यकता नहीं है।

यह पहली बार देखने की सबसे उपयुक्त स्थिति की तरह लगता है। मैं शायद आपके मामले में 400 पसंद करूंगा। एक 40 9 स्पष्ट रूप से इंगित करेगा कि संसाधन के साथ एक संघर्ष है लेकिन वास्तव में ऐसा कुछ भी नहीं है जो अनुरोधकर्ता कर सकता है जो संसाधन को पूरी तरह से बदलने के परिणाम को कम कर सकता है (यानी, पहले एक संपर्क जोड़ें)। 40 9 प्रतिक्रियाओं में से अधिकांश आशावादी समेकन विफलताओं जैसे कि संसाधन को संशोधित करने की कोशिश कर रहे थे, जिसे पुनर्प्राप्त करने के बाद से संशोधित किया गया था। उदाहरण के लिए, concurrency failures returned by AtomServer built over Apache Adbera देखें।

तो उन सभी के साथ। मैं शायद प्रतिक्रिया रेखा के रूप में 400 Cannot Delete Last Contact जैसे कुछ का उपयोग करूंगा। याद रखें कि आपको स्टेटस कोड से जुड़े वाक्यांश को बदलने की अनुमति है। यह ऐसी चीज करने का वाकई अच्छा समय है।

+0

आपके इनपुट डी। शॉली के लिए धन्यवाद, कारण 400 का उपयोग करने में मुझे संकोच नहीं है क्योंकि परिभाषा विशेष रूप से "विकृत वाक्यविन्यास के कारण" कहती है। प्रतीत होता है कि आप इस प्रोटोकॉल को एप्लिकेशन प्रोटोकॉल को शामिल करने के लिए विस्तृत कर रहे हैं। क्या आपके पास कोई संदर्भ है जो उस व्याख्या का समर्थन करता है? –

+0

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

+0

ठीक है, कुछ सहयोगियों के साथ चर्चा करने के बाद हमने 405 के साथ जाने का फैसला किया है। मैं इसे सही उत्तर के रूप में चिह्नित कर रहा हूं क्योंकि यह निर्णय लेने में हमारी सहायता करने में उपयोगी था। मदद के लिये शुक्रिया। –

संबंधित मुद्दे