HTTP GET के जवाब में 202 "स्वीकृत" वापस करना गलत है?


89

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

संसाधन के लिए प्राप्त पहला GET अनुरोध सर्वर पर गणना शुरू करता है। यदि गणना कुछ सेकंड के भीतर पूरी हो जाती है, तो गणना का प्रतिनिधित्व वापस आ जाता है। अन्यथा, एक 202 "स्वीकृत" स्थिति कोड लौटा दिया जाता है, और अंतिम प्रतिनिधित्व उपलब्ध होने तक ग्राहक को संसाधन का चुनाव करना चाहिए।

इस व्यवहार का कारण निम्नलिखित है: यदि कोई परिणाम कुछ सेकंड के भीतर उपलब्ध होता है, तो इसे जल्द से जल्द पुनर्प्राप्त करने की आवश्यकता होती है; अन्यथा, जब यह उपलब्ध हो जाता है तो यह महत्वपूर्ण नहीं है।

सीमित मेमोरी और अनुरोधों की सरासर मात्रा के कारण, न तो NIO और न ही लंबे समय तक मतदान एक विकल्प है ( यानी मैं लगभग पर्याप्त कनेक्शन खुला नहीं रख सकता, और यहां तक ​​कि मैं स्मृति में सभी अनुरोधों को भी फिट नहीं कर सकता; एक बार "कुछ सेकंड" पारित कर दिया है, मैं अतिरिक्त अनुरोधों को जारी रखता हूं)। इसी तरह, क्लाइंट सीमाएँ ऐसी हैं कि वे एक पूर्ण कॉलबैक को संभाल नहीं सकते, इसके बजाय। अंत में, ध्यान दें कि मैं "फ़ैक्ट्री" संसाधन बनाने में दिलचस्पी नहीं रखता हूं, जो कि एक POST है, क्योंकि अतिरिक्त राउंडट्रीप्स का मतलब है कि हम टुकड़े टुकड़े की वास्तविक समय सीमा से अधिक वांछित है (इसके अलावा, यह अतिरिक्त जटिलता है; भी, यह एक ऐसा संसाधन है जो होगा) कैशिंग से लाभ)।

मुझे लगता है कि GET अनुरोध के जवाब में 202 "स्वीकृत" स्थिति कोड वापस करने पर कुछ विवाद है, क्योंकि मैंने इसे अभ्यास में कभी नहीं देखा है, और इसका सबसे सहज उपयोग असुरक्षित तरीकों के जवाब में है, लेकिन मैंने कभी नहीं किया कुछ भी विशेष रूप से इसे हतोत्साहित पाया। इसके अलावा, क्या मैं सुरक्षा और सुविधा दोनों को संरक्षित नहीं कर रहा हूं?

तो, लोग इस दृष्टिकोण के बारे में क्या सोचते हैं?

संपादित करें : मुझे यह उल्लेख करना चाहिए कि यह तथाकथित व्यापार वेब एपीआई के लिए है - ब्राउज़रों के लिए नहीं।


2
मुझे व्यक्तिगत रूप से लगता है कि यह एक अच्छा है, यह बिल्कुल एक की परिभाषा है 202। यह शायद ही कभी व्यवहार में उपयोग किया जाता है IMHO अधिक होता है क्योंकि कुछ वेबडेवलपर्स उचित स्थिति कोड के बारे में परवाह करते हैं क्योंकि वे ब्राउज़र / उपयोगकर्ता-एजेंट इंटरैक्शन के लिए अधिक उपयोग किए जाते हैं, जिस स्थिति में 202उन्हें कोई दृश्य सुराग नहीं देता है (उन्हें एक दें 200और वे खुश हैं। ..)।
विक्रोकन

1
@ user359996, बस उपयोग करें 200202यह होना चाहिए, लेकिन व्यवहार में लोगों को उम्मीद नहीं है 202
पचेरियर

हालांकि अभ्यास में उपयोगी होने के लिए इसे 200 के लिए ईटीए की आवश्यकता होती है।
रोब

जवाबों:


66

यदि यह एक अच्छी तरह से परिभाषित और -निर्धारित एपीआई के लिए है, तो जो हो रहा है उसके लिए बिल्कुल सही 202लगता है

यदि यह सार्वजनिक इंटरनेट के लिए है, तो मैं क्लाइंट संगतता के बारे में बहुत चिंतित हूं। मैंने बहुत सारे if (status == 200)हार्ड-कोडेड देखे हैं .... उस स्थिति में, मैं वापस लौटूंगा 200

इसके अलावा, RFC कोई संकेत नहीं देता है कि GET अनुरोध के लिए 202 का उपयोग करना गलत है, जबकि यह अन्य कोड विवरण (जैसे 200) में स्पष्ट अंतर बनाता है।

प्रसंस्करण के लिए अनुरोध स्वीकार कर लिया गया है, लेकिन प्रसंस्करण पूरा नहीं हुआ है।


16

हमने हाल ही में एक एप्लिकेशन, एक क्लाइंट (कस्टम एप्लिकेशन, ब्राउज़र नहीं) के लिए ऐसा किया था, एक प्रश्न पोस्ट किया गया था और सर्वर 202 को एक यूआरआई के साथ "नौकरी" में पोस्ट किया जाएगा - ग्राहक उस यूआरआई का उपयोग चुनाव के लिए करेगा। परिणाम - यह अच्छी तरह से फिट करने के लिए लगता है कि क्या किया जा रहा था।

यहाँ पर सबसे महत्वपूर्ण बात यह है कि आपकी सेवा / एपीआई कैसे काम करती है और 202 की प्रतिक्रिया का क्या अर्थ है।


+1 आपकी टिप्पणी के लिए धन्यवाद। प्रलेखन के बारे में अच्छी बात है। लेकिन कृपया मेरे प्रश्न ("कारखाने" के लिए देखो) को स्पष्ट संपादन पर ध्यान दें।
उपयोगकर्ता 359996

ठीक है, आप प्रतिक्रिया में उस URI को छोड़ सकते हैं यदि आप केवल उसी URI का चुनाव करना चाहते हैं जैसा कि आपने अनुरोध किया था। (बस दस्तावेज़ यह कैसे काम करना चाहिए :-))
nos

अच्छा विचार है, लेकिन याद रखें कि मैं कैशिंग चाहता हूं, इसलिए कोई पोस्ट नहीं। इसके अलावा, URI संसाधन निर्दिष्ट करता है, विधि नहीं। मैं RPC दृष्टिकोण के बजाय RESTful ले रहा हूं (क्षमा करें, एक और अनिर्दिष्ट बाधा - मेरा बुरा)।
user359996

सटीक होने के लिए, "रेस्टफुल" से मेरा वास्तव में मतलब है "रिसोर्स-ओरिएंटेड", जो कि तकनीकी रूप से REST बाधाओं से कुछ अधिक है।
user359996

12

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

दूसरी ओर POST सर्वर पर किसी चीज़ की स्थिति को बदलने का अनुरोध है। रिकॉर्ड डालें, रिकॉर्ड हटाएं, नौकरी चलाएं, ऐसा ही कुछ। 202 एक POST के लिए उपयुक्त होगा जो वापस आ गया है लेकिन समाप्त नहीं हुआ है, लेकिन वास्तव में GET अनुरोध नहीं है।

यह सभी बहुत प्यूरिटन है और जंगल में अच्छी तरह से अभ्यास नहीं किया जाता है, इसलिए आप शायद 202 लौटकर सुरक्षित हैं। GET को 200 वापस करना चाहिए। POST 200 वापस आ सकता है यदि यह समाप्त हो गया है या 202 यह नहीं हुआ है।

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


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

ओह, तौके पक्का। आप सही हैं, GET जाने का रास्ता है। और मुझे नहीं लगता कि HTTP spc वास्तव में ध्यान में रखा गया है जो कि तैयार नहीं है। इसलिए वह किसी भी तरह से जा सकता था
डगलनेकर 18

7
(अब-अप्रासंगिक) आधिकारिक टिप्पणी: हां, मैं इसे बेकार मानता हूं। संसाधन न संशोधित किया गया है किया जा रहा है और न ही बनाया है, बल्कि यह है प्रतिनिधित्व अभी तक नहीं की गई है।
user359996

1
ऐसा कहां कहा गया है? इसके अलावा, अगर मैं 200 वापस करता हूं, तो ग्राहक को उम्मीद करनी चाहिए कि प्रतिनिधित्व वापस आ गया है, लेकिन ऐसा नहीं हुआ है।
user359996

1
मैं इसे वापिस लेता हूँ। 202 केवल GET या POST के अनुरूप नहीं है, ऐसा लगता है। जब मैं प्रोटोकॉल को देखता था तो मेरी मानसिकता केवल 202 की होती थी जो केवल GET अनुरोधों के लिए अस्तित्व में थी। 202 आपके उद्देश्यों के लिए ठीक होना चाहिए।
डगलनेकर

0

ऐसे संसाधन के मामले में जिसे एक इकाई का प्रतिनिधित्व माना जाता है जो स्पष्ट रूप से एक आईडी द्वारा निर्दिष्ट किया जाता है (जैसा कि "कारखाने" संसाधन के विपरीत, जैसा कि प्रश्न में वर्णित है), मैं GET विधि के साथ रहने की सलाह देता हूं और, कुछ में स्थिति जब आलसी-निर्माण या किसी अन्य अस्थायी स्थिति के कारण इकाई / प्रतिनिधित्व उपलब्ध नहीं है, तो 503 सेवा अनुपलब्ध प्रतिक्रिया कोड का उपयोग करें जो अधिक उपयुक्त है और वास्तव में इस तरह की स्थितियों के लिए डिज़ाइन किया गया था।

इसके लिए रीजनिंग HTTP के लिए RFC में मिल सकती है (कृपया 503 रिस्पॉन्स कोड के विवरण को सत्यापित करें), साथ ही साथ कई अन्य संसाधनों पर।

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

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