2010-06-18 11 views
8

मैंने थोड़ा सा पोक किया है, लेकिन अनुरोध के सफल होने पर मुझे HTTP स्थिति कोड नहीं दिखाई देता है, लेकिन "वापसी की स्थिति" के बाद कोई त्रुटि होती है।"त्रुटियों के साथ सफलता" के लिए HTTP स्थिति कोड?

उदा।, कहें कि आप एक अनुरोध को संसाधित करते हैं, यह डेटाबेस के प्रति प्रतिबद्ध है, लेकिन परिणाम लौटने पर आप स्मृति का संचालन करते हैं, या एनपीई का सामना करते हैं, या आप क्या हैं। यह 200 प्रतिक्रिया रहा है, लेकिन अब, आंतरिक रूप से, आप उचित, अच्छी तरह से गठित प्रतिक्रिया वापस करने में सक्षम नहीं हैं।

202 Accepted फिट नहीं लगता है क्योंकि हम पहले ही अनुरोध संसाधित कर चुके हैं।

क्या स्थिति कोड का अर्थ है "सफलता, लेकिन त्रुटियां"? क्या कोई भी अस्तित्व में है?

+0

उस स्थिति में आपको यह सुनिश्चित करना होगा कि आपने क्लाइंट को पहले ही कुछ डेटा नहीं भेजा है, क्योंकि तब आप पहले से ही कोई वापसी नहीं कर चुके हैं: डेटा के पहले बाइट्स से पहले हेडर (स्टेटस कोड सहित) ब्राउज़र को भेजा गया। –

+0

हे - दी गई :)। मुझे लगता है कि मैं उस बिंदु-से-रिटर्न से पहले पॉइंट-ऑफ-नो-रिटर्न के बारे में बात कर रहा हूं। अधिकांश समय, हालांकि, सर्वर साइड कोड इसे भेजने से पहले स्मृति में पूर्ण प्रतिक्रिया बनाता है, क्योंकि वे आमतौर पर ऐसा करने के लिए काफी छोटे होते हैं। –

उत्तर

3

यदि सर्वर को पता है कि इसमें कोई समस्या आई है, तो उसे सामान्यतः 5xx त्रुटि वापस करनी चाहिए। सबसे सामान्य एक 500 Server Error, जो RFC 2616 इस प्रकार परिभाषित करता है:

500 आंतरिक सर्वर त्रुटि

सर्वर ने अनपेक्षित स्थिति है जो यह अनुरोध पूरा करने से रोक दिया है।

फिर अनुरोध की पुन: प्रयास करने के लिए ग्राहक की ज़िम्मेदारी है। यदि पिछला अनुरोध आंशिक रूप से प्रतिबद्ध था, तो यह सर्वर को (या डेटाबेस की) ज़िम्मेदारी है कि उसे वापस रोल करने के लिए, या डुप्लिकेट लेनदेन को उचित तरीके से संभालने के लिए।

+1

मैं इस जवाब से वास्तव में संतुष्ट नहीं हूं। "पूरा" मतलब क्या है, बिल्कुल? हमने संसाधन को संशोधित किया है जिस तरह से ग्राहक ने अनुरोध किया है। यदि वे पृष्ठ को पुनः लोड करते हैं, तो वे परिवर्तन देखेंगे। जहां तक ​​उपयोगकर्ता का संबंध है, यह सफल रहा। मेरे लिए, यह वास्तव में लगता है जैसे हमने _request_ को पूरा कर लिया है, लेकिन _response_ को पूरा नहीं किया है। –

+0

@ रिचर्ड: मैं हमेशा प्रतिक्रिया को शामिल करने के लिए "पूरा" समझा जाता हूं (लेकिन मैं इस पर गलत हो सकता हूं)। फिर भी, यह स्थिति कोड बहुत सामान्य है, और इसका उपयोग तब भी किया जाना चाहिए जब सर्वर किसी समस्या का सामना करता हो जिसे किसी अन्य विशिष्ट 5xx त्रुटि द्वारा वर्णित नहीं किया जा सकता है। मुझे लगता है [@Jim] (http://stackoverflow.com/users/45935/jim-ferrans) ने वर्णन किया कि मैं बेहतर कहने का इरादा रखता हूं, [दूसरे जवाब में] (http://stackoverflow.com/questions/3066972/ http-स्थिति-कोड के लिए सफलता-त्रुटियों के साथ/3067090 # 3067090)। –

1

मैं @ डैनियल से सहमत हूं कि उचित प्रतिक्रिया एक HTTP 500 (सर्वर त्रुटि) है। जब कोई त्रुटि होती है तो लेनदेन को वापस रोल करने के लिए वेब एप्लिकेशन को लिखा जाना चाहिए, चीजों को आधा समाप्त नहीं छोड़ना चाहिए।

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

+0

स्पष्टीकरण के लिए, लेनदेन पहले ही प्रतिबद्ध है (उदाहरण के लिए, आउटऑफमेमरी त्रुटि प्रतिक्रिया के एन्कोडिंग के दौरान होती है) पर विचार करें। Idempotency लागू करने के लिए, आपको संशोधन नियंत्रण लागू करने की आवश्यकता होगी, नहीं? सर्वर को सबमिट किए गए परिवर्तनों का ट्रैक रखने और आईडी को आपूर्ति और आईडी बदलने के लिए। गैर-अस्थायी त्रुटियों को संभालने का भी मामला है (कहें कि एक बग है जिसके परिणामस्वरूप स्मृति त्रुटि से बाहर एक एनपीई है) - क्लाइंट वे सभी जो भी चाहें पुनः प्रयास कर सकते हैं, लेकिन यह कभी सफल नहीं होगा (इसके बावजूद सफल होने के बावजूद पहली बार, और बाद के समय अनावश्यक)। –

+0

@ रिचर्ड: यह "सभी निर्भर करता है"। यदि यह एक सामग्री प्रबंधन ऐप है और आपको कोई फर्क नहीं पड़ता कि कभी-कभी सख्त क्रम से दो "एक साथ" अपडेट होने लगते हैं, तो आपको वर्जनिंग करने की आवश्यकता नहीं है। लेकिन यदि आपके पास कठोर बाधाएं हैं तो वर्जनिंग या टाइमस्टैम्पिंग उपयुक्त हो सकती है। एक और तरीका लेनदेन की सीमाओं के भीतर जितनी अधिक हो सके उतनी प्रतिक्रिया बनाने के लिए है, इसलिए ओओएमई लेनदेन को रद्द कर देगा। और हो सकता है कि लगातार संदेश कतार लेनदेन अनुरोध और परिणाम हो जो आप चाहते हैं (अपाचे के ActiveMQ देखें)। जांच प्रश्नों के लिए +1! –

4

HTTP में ऐसा कोई स्थिति कोड नहीं है, लेकिन ऐसी कोई अच्छी प्रथा है जो आपको ऐसी परिस्थितियों को संभालने की अनुमति देती है - उपयोगकर्ता को पोस्ट ऑपरेशन के बाद रीडायरेक्ट करें।यह असफलता

  • इंगित करने के लिए सर्वर सफल होती है एक 500 त्रुटि भेजता

    1. एक पोस्ट अनुरोध सर्वर
    2. सर्वर विफल रहता है पर डेटा को संशोधित करने की कोशिश करता है, -

      यहाँ एक ब्रेक डाउन है यह एक 302 रीडायरेक्ट प्रतिक्रिया

    3. ब्राउज़र तो सर्वर के लिए एक ताजा GET अनुरोध
    4. यह असफल रहता है, तो आप एक 500 त्रुटि मिलती है भेजता भेजता है, अन्यथा आप एक 200
    5. मिल

    तो, 'सहेजे गए डेटा का आपका उपयोग केस, लेकिन इसे तुरंत पुनर्प्राप्त नहीं कर सकता है' प्रारंभिक पोस्ट के लिए 302 रीडायरेक्ट में अनुवाद करता है, इसके बाद बाद के जीईटी के लिए 500 के बाद।

    इस दृष्टिकोण के अन्य फायदे हैं - आप परेशानियों से छुटकारा पा रहे हैं 'क्या आप वाकई डेटा को पुनः सबमिट करना चाहते हैं?' संदेश। आपके बैक/फॉरवर्ड/रीफ्रेश बटन को प्रयोग करने योग्य भी रखता है।

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