"अभी भी प्रसंस्करण" के लिए HTTP स्थिति कोड


47

मैं एक RESTful API बना रहा हूं जो अंतिम हैंडलिंग के लिए लंबे समय से चल रहे कामों का समर्थन करता है।

इस एपीआई के लिए विशिष्ट वर्कफ़्लो होगा:

  1. उपयोगकर्ता फॉर्म भरता है
  2. API में क्लाइंट डेटा पोस्ट करता है
  3. एपीआई रिटर्न 202 स्वीकृत
  4. ग्राहक उस अनुरोध के लिए उपयोगकर्ता को एक अद्वितीय URL पर पुनर्निर्देशित करता है ( /results/{request_id})
  5. ~ अंत में ~
  6. क्लाइंट फिर से URL पर जाता है, और उस पृष्ठ पर परिणाम देखता है।

मेरी परेशानी चरण 6 पर है। जब भी कोई उपयोगकर्ता पृष्ठ पर जाता है, मैं अपने एपीआई ( GET /api/results/{request_id}) से अनुरोध करता हूं । आदर्श रूप से, कार्य अब तक पूरा हो चुका होगा, और मैं उनके कार्य के परिणामों के साथ 200 ओके वापस करूंगा।

लेकिन उपयोगकर्ता धक्का-मुक्की कर रहे हैं, और मुझे उम्मीद है कि कई अति उत्साही रिफ्रेश होंगे, जब परिणाम अभी तक समाप्त नहीं हुआ है।

इंगित करने के लिए स्थिति कोड के लिए मेरा सबसे अच्छा विकल्प क्या है:

  • यह अनुरोध मौजूद है,
  • यह अभी तक नहीं किया गया है,
  • लेकिन यह भी विफल नहीं हुआ।

मुझे उस सभी से संवाद करने के लिए एक एकल कोड की उम्मीद नहीं है, लेकिन मैं कुछ ऐसा चाहूंगा जो मुझे क्लाइंट से सामग्री की अपेक्षा करने के बजाय मेटाडेटा पास करने की अनुमति दे।

यह 202 को वापस करने के लिए समझ में आ सकता है, क्योंकि इसका कोई अन्य अर्थ नहीं होगा: यह एक GETअनुरोध है, इसलिए संभवतः "स्वीकार" नहीं किया जा सकता है। क्या यह एक उचित विकल्प होगा?

इस सब के लिए स्पष्ट विकल्प - जो कार्य करता है, लेकिन स्थिति कोड के एक उद्देश्य को हरा देता है - हमेशा मेटाडेटा को शामिल करना होगा:

200 OK

{
    status: "complete",
    data: {
        foo: "123"
    }
}

... या ...

200 OK

{
    status: "pending"
}

तब क्लाइंट साइड, मैं (साँस) होगा switchपर response.data.statusनिर्धारित करने के लिए अनुरोध पूरा किया गया।

क्या मुझे यही करना चाहिए? या कोई बेहतर विकल्प है? यह सिर्फ इसलिए मुझे लगता है वेब 1.0।


1
क्या 1xx कोड वास्तव में उस उद्देश्य के लिए नहीं बनाया गया है?
एंडी

@ और मैं 102 पर देख रहा था, लेकिन वह WebDAV सामान के लिए है। इसके अलावा, नहीं ... वे ज्यादातर पारगमन संचार के लिए हैं। वेब सॉकेट्स और इस तरह से स्विच करने में उपयोगी।
मैथ्यू Haugen

आप किस तरह की देरी से बात कर रहे हैं? दस पल? या 6 घंटे? यदि देरी कम है और आम तौर पर एक ही ब्राउज़र की यात्रा के भीतर, आप समय-समय पर मतदान के बजाय लंबे समय तक मतदान या वेब सॉकेट कर सकते हैं।
ग्रैंडमास्टरबी

@GrandmasterB यह घंटे, संभावित रूप से है। मैं स्वयं नौकरी प्रसंस्करण के लिए जिम्मेदार नहीं हूं, इसलिए मेरे पास वास्तव में अच्छा अनुमान नहीं है, लेकिन यह थोड़ी देर होगा। अन्यथा, मैं सिर्फ पहला POSTअनुरोध खुला छोड़ दूंगा। लंबे मतदान या वेब सॉकेट के साथ मुख्य मुद्दा यह है कि उपयोगकर्ता ब्राउज़र को बंद कर सकता है और वापस आ सकता है। मैं उन्हें उस समय फिर से खोल सकता था (और यही मैं करता हूं), लेकिन मुझे लगता है कि उन सॉकेट्स को खोलने से पहले कॉल करने के लिए एक ही एपीआई होना क्लीनर है, क्योंकि यह एक एज-केस है जिससे कि समस्या उत्पन्न होती है।
मैथ्यू Haugen

जवाबों:


48

HTTP 202 स्वीकृत (HTTP / 1.1)

आप HTTP 202 Acceptedस्टेटस ढूंढ रहे हैं । RFC 2616 देखें :

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

HTTP 102 प्रसंस्करण (WebDAV)

RFC 2518 उपयोग करने का सुझाव देता है HTTP 102 Processing:

102 (प्रसंस्करण) स्थिति कोड एक अंतरिम प्रतिक्रिया है जिसका उपयोग क्लाइंट को सूचित करने के लिए किया जाता है कि सर्वर ने पूरा अनुरोध स्वीकार कर लिया है, लेकिन अभी तक इसे पूरा नहीं किया है।

लेकिन यह एक चेतावनी है:

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

मुझे यकीन नहीं है कि अंतिम वाक्य की व्याख्या कैसे करें। क्या प्रोसेसिंग के दौरान सर्वर को कुछ भी भेजने से बचना चाहिए और पूरा होने के बाद ही जवाब देना चाहिए ? या यह केवल प्रोसेसिंग समाप्त होने पर ही प्रतिक्रिया को समाप्त करने के लिए मजबूर करता है ? यदि आप प्रगति की रिपोर्ट करना चाहते हैं तो यह उपयोगी हो सकता है। HTTP 102 और फ्लश प्रतिक्रिया बाइट (या लाइन द्वारा लाइन) द्वारा बाइट भेजें।

उदाहरण के लिए, एक लंबी लेकिन रैखिक प्रक्रिया के लिए, आप प्रत्येक चरित्र के बाद फ्लशिंग एक सौ डॉट्स भेज सकते हैं। यदि क्लाइंट पक्ष (जैसे जावास्क्रिप्ट एप्लिकेशन) जानता है कि उसे ठीक 100 वर्णों की अपेक्षा करनी चाहिए, तो वह इसे उपयोगकर्ता को दिखाने के लिए प्रगति पट्टी के साथ मेल कर सकता है।

एक अन्य उदाहरण एक ऐसी प्रक्रिया की चिंता करता है जिसमें कई गैर-रेखीय चरण होते हैं। प्रत्येक चरण के बाद, आप एक लॉग संदेश को फ्लश कर सकते हैं जो अंततः उपयोगकर्ता को प्रदर्शित किया जाएगा, ताकि अंतिम उपयोगकर्ता को पता चल सके कि प्रक्रिया कैसे हो रही है।

प्रगतिशील फ्लशिंग के साथ मुद्दे

ध्यान दें कि जब इस तकनीक की अपनी खूबियाँ हैं, तो मैं इसकी सिफारिश नहीं करूँगा । कारणों में से एक यह है कि यह कनेक्शन को खुले रहने के लिए मजबूर करता है, जो सेवा की उपलब्धता के मामले में चोट पहुंचा सकता है और अच्छी तरह से स्केल नहीं करता है।

एक बेहतर तरीका यह है कि HTTP 202 Acceptedया तो जवाब देने के लिए या तो उपयोगकर्ता को बाद में आपको यह निर्धारित करने के लिए वापस जाने दें कि क्या प्रसंस्करण समाप्त हो गया है (उदाहरण के लिए किसी दिए गए यूआरआई को बार-बार कॉल /process/resultकरना जैसे कि HTTP 404 के साथ प्रतिक्रिया नहीं मिलेगी या HTTP 409 प्रक्रिया तक संघर्ष। फ़िनिश और परिणाम तैयार है), या उपयोगकर्ता को सूचित करें जब प्रसंस्करण किया जाता है यदि आप क्लाइंट को संदेश कतार सेवा ( उदाहरण ) या वेबस्केट के माध्यम से वापस कॉल करने में सक्षम हैं ।

व्यावहारिक उदाहरण

एक वेब सेवा की कल्पना करें जो वीडियो परिवर्तित करती है। प्रवेश बिंदु है:

POST /video/convert

जो HTTP अनुरोध से एक वीडियो फ़ाइल लेता है और इसके साथ कुछ जादू करता है। आइए कल्पना करें कि जादू सीपीयू-गहन है, इसलिए यह अनुरोध के हस्तांतरण के दौरान वास्तविक समय में नहीं किया जा सकता है। इसका मतलब है कि एक बार फ़ाइल स्थानांतरित हो जाने के बाद, सर्वर HTTP 202 Acceptedकुछ JSON सामग्री के साथ जवाब देगा , जिसका अर्थ है "हाँ, मुझे आपका वीडियो मिल गया है, और मैं इस पर काम कर रहा हूं; यह भविष्य में कहीं भी तैयार होगा और आईडी 123 के माध्यम से उपलब्ध होगा। "

क्लाइंट के पास प्रोसेसिंग खत्म होने पर अधिसूचित होने के लिए एक संदेश कतार की सदस्यता लेने की संभावना है। एक बार जब यह समाप्त हो जाता है, तो ग्राहक संसाधित वीडियो डाउनलोड कर सकता है:

GET /video/download/123

जो जाता है HTTP 200

यदि ग्राहक अधिसूचना प्राप्त करने से पहले इस URI से पूछताछ करता है तो क्या होगा? खैर, सर्वर तब से जवाब देगा HTTP 404, वास्तव में, वीडियो अभी तक मौजूद नहीं है। यह वर्तमान में तैयार किया जा सकता है। यह कभी अनुरोध नहीं किया जा सकता है। यह अतीत में कुछ समय तक मौजूद रह सकता है और बाद में हटा दिया जा सकता है। यह सब मायने रखता है कि परिणामी वीडियो उपलब्ध नहीं है।

अब, क्या होगा अगर ग्राहक न केवल अंतिम वीडियो के बारे में परवाह करता है, बल्कि प्रगति के बारे में भी (जो संदेश कतार सेवा या किसी भी समान तंत्र नहीं है तो और भी महत्वपूर्ण होगा)?

इस स्थिति में, आप एक और समापन बिंदु का उपयोग कर सकते हैं:

GET /video/status/123

जो इस के समान प्रतिक्रिया देगा:

HTTP 200
{
    "id": 123,
    "status": "queued",
    "priority": 2,
    "progress-percent": 0,
    "submitted-utc-time": "2016-04-19T13:59:22"
}

बार-बार अनुरोध करने पर भी प्रगति दिखाई देगी:

HTTP 200
{
    "id": 123,
    "status": "done",
    "progress-percent": 100,
    "submitted-utc-time": "2016-04-19T13:59:22"
}

उन तीन प्रकार के अनुरोधों के बीच अंतर करना महत्वपूर्ण है:

  • POST /video/convertएक कार्य कतार में। इसे केवल एक बार कॉल किया जाना चाहिए: इसे फिर से कॉल करना एक अतिरिक्त कार्य को कतारबद्ध करेगा।
  • GET /video/download/123ऑपरेशन के परिणाम की चिंता : संसाधन वीडियो है। प्रसंस्करण - जो हुड के तहत हुआ है वह अनुरोध से पहले वास्तविक परिणाम तैयार करने के लिए और स्वतंत्र रूप से अनुरोध करने के लिए - यहाँ अप्रासंगिक है। इसे एक बार या कई बार बुलाया जा सकता है।
  • GET /video/status/123प्रसंस्करण प्रति से संबंधित है । यह कुछ भी कतार नहीं है। यह परिणामी वीडियो के बारे में परवाह नहीं करता है। संसाधन प्रसंस्करण ही है। इसे एक बार या कई बार बुलाया जा सकता है।

1
क्या एक 202 की प्रतिक्रिया में समझ में आता है GET, हालांकि? यह निश्चित रूप से प्रारंभिक के लिए सही विकल्प है POST, यही कारण है कि मैं इसका उपयोग कर रहा हूं। लेकिन यह GET"स्वीकार किए जाते हैं" कहने के लिए शब्दशः संदिग्ध लगता है, जब यह उस विशेष अनुरोध से कुछ भी स्वीकार नहीं करता था।
मैथ्यू Haugen

2
@ मेनमा जैसा मैंने कहा, मैं POSTकाम को कतार में खड़ा करता हूं , फिर मैं GETपरिणाम देता हूं , संभवतः क्लाइंट द्वारा सत्र बंद करने के बाद। एक 404 कुछ मैं अच्छी तरह से करने पर विचार किया है, लेकिन यह गलत लगता है, के बाद से अनुरोध है पाया, यह अभी पूरा नहीं हुआ है। यह मुझे इंगित करेगा कि कतारबद्ध नौकरी नहीं मिली, जो एक बहुत अलग स्थिति है।
मैथ्यू Haugen

1
@ मैथ्यूहॉजेन: जब आप GETभाग करते हैं, तो इसके बारे में अधूरे अनुरोध के रूप में नहीं सोचते हैं , लेकिन ऑपरेशन के परिणाम प्राप्त करने के अनुरोध के रूप में । उदाहरण के लिए, यदि मैं आपको वीडियो परिवर्तित करने के लिए कहता हूं और इसे करने में आपको पांच मिनट लगते हैं, तो परिवर्तित वीडियो के लिए अनुरोध करने के दो मिनट बाद HTTP 404 में परिणाम होना चाहिए , क्योंकि वीडियो अभी तक वहां नहीं है। दूसरी ओर, स्वयं ऑपरेशन की प्रगति के लिए अनुरोध करना, संभवतः परिणामस्वरूप HTTP 200 में होगा जिसमें बाइट्स की संख्या में परिवर्तन, गति इत्यादि होगी
Arseni Mourzenko

5
संसाधन के लिए HTTP स्थिति कोड अभी तक उपलब्ध नहीं है 409 संघर्ष प्रतिक्रिया ("संसाधन की वर्तमान स्थिति के साथ एक संघर्ष के कारण अनुरोध पूरा नहीं किया जा सका), 404 प्रतिक्रिया के बजाय, इस मामले में कि एक संसाधन नहीं देता है 't मौजूद नहीं है क्योंकि यह उत्पन्न होने के बीच में है।
ब्रायन

1
@ ब्रायन आपकी टिप्पणी इस सवाल का उचित जवाब देगी। हालांकि मैं तब "[t] के साथ जवाब दूंगा कि उसका कोड केवल उन स्थितियों में अनुमत है जहां यह उम्मीद की जाती है कि उपयोगकर्ता संघर्ष को हल करने और अनुरोध को फिर से शुरू करने में सक्षम हो सकता है," जो मेरे मामले में कड़ाई से सच नहीं है, लेकिन ऐसा लगता है से कम गलत "नहीं मिला।" मुझे का एक हिस्सा एक 409 की ओर झुकाव के साथ एक रिट्री-आफ्टर हैडर पर पिन किया गया है। एकमात्र मुद्दा यह है कि एक GET के लिए 409 वापस करना अजीब लगता है, लेकिन मैं उस अजीबता के साथ रह सकता हूं - यह भविष्य में अन्यथा परिभाषित होने की संभावना नहीं है।
मैथ्यू Haugen

5

इस सब के लिए स्पष्ट विकल्प - जो कार्य करता है, लेकिन स्थिति कोड के एक उद्देश्य को हरा देता है - हमेशा मेटाडेटा को शामिल करना होगा:

यह जाने का सही तरीका है। डोमेन विशिष्ट लॉग (उर्फ बिजनेस लॉजिक) के संबंध में राज्य का एक संसाधन संसाधन के प्रतिनिधित्व के सामग्री प्रकार के लिए एक मामला है।

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

याद रखें HTTP स्टेटस कोड उस संसाधन के किसी भी विवरण से स्वतंत्र रूप से निपटाए जा रहे क्लाइंट और सर्वर के बीच राज्य हस्तांतरण के अनुरूप है। जब आप GETअपने संसाधन को अपने क्लाइंट से वर्तमान स्थिति में संसाधन के प्रतिनिधित्व के लिए पूछ रहे हैं, तो यह एक पक्षी की तस्वीर हो सकती है, यह एक वर्ड डॉक्यूमेंट हो सकता है, यह वर्तमान में अस्थायी हो सकता है। HTTP प्रोटोकॉल परवाह नहीं करता है। HTTP अनुरोध कोड उस अनुरोध के परिणाम से मेल खाता है। क्या POSTक्लाइंट से सर्वर तक एक संसाधन को सर्वर में स्थानांतरित किया गया, जहां सर्वर ने फिर उसे एक URL दिया जो क्लाइंट देख सकता है? हाँ? फिर वह एक 201 Createdप्रतिक्रिया है।

संसाधन एक एयरलाइन बुकिंग हो सकती है जो वर्तमान में 'समीक्षा की जाने वाली' स्थिति है। या यह उत्पाद खरीद आदेश हो सकता है जो 'स्वीकृत' स्थिति में है। वे राज्य डोमेन विशिष्ट हैं और HTTP प्रोटोकॉल क्या है। HTTP प्रोटोकॉल क्लाइंट और सर्वर के बीच संसाधनों के हस्तांतरण से संबंधित है।

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

डोमेन विशिष्ट सामग्री क्लाइंट और सर्वर Content Typeके लिए संसाधन के आधार पर खुद के बीच पता लगाने के लिए है। HTTP प्रोटोकॉल इसके लिए अज्ञेयवादी है।

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

आशा है कि चीजों को स्पष्ट करने में मदद करता है


"क्या क्लाइंट से सर्वर पर POST ने एक संसाधन को सर्वर में स्थानांतरित किया, जहां सर्वर ने फिर उसे एक URL दिया जो क्लाइंट देख सकता है? हां? फिर यह एक 201 बनाई गई प्रतिक्रिया है।" 202 स्वीकृत यह भी एक प्रतिक्रिया के रूप में स्वीकार्य है यदि सर्वर संसाधन को संसाधित करने के लिए तुरंत कार्य नहीं कर सकता है, जो कि ओपी कर रहा है।
एंडी

1
बात यह है कि सर्वर तुरंत कार्य कर रहा है। यह URL के साथ तुरंत संसाधन बनाता है। यह सिर्फ संसाधन की स्थिति "लंबित" (या कुछ) है। यह एक व्यावसायिक डोमेन स्थिति है। जहाँ तक HTTP प्रोटोकॉल का संबंध है, सर्वर ने जैसे ही संसाधन बनाया और क्लाइंट को संसाधन का URL दिया। आप उस संसाधन को प्राप्त कर सकते हैं। POST अनुरोध स्वयं लंबित नहीं है। दो अलग वैचारिक डोमेन को अलग रखने से मेरा यही मतलब है। यदि ग्राहक आग भेज रहा था और भूल गए कि पोस्ट अनुरोध पर घंटों तक कार्रवाई नहीं की गई तो 202 लागू होगा।
कॉर्मैक मुलहेल

यदि कोई url मौजूद है तो कोई भी परवाह नहीं करता है, लेकिन आप डेटा को संसाधन का प्रतिनिधित्व नहीं कर सकते क्योंकि यह अभी भी संसाधित हो रहा है। जब तक यह वीडियो प्राप्त करने के लिए इस्तेमाल नहीं किया जा सकता है तब तक url न बनाएं।
एंडी

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

4

मुझे इस ब्लॉग के सुझाव उचित लगे: REST और लंबे समय तक चलने वाली नौकरियां

संक्षेप में:

  1. सर्वर ने "202" को "लोकेशन" हेडर के साथ यूआरआई को क्लाइंट की स्थिति, जैसे "/ कतार / 12345" की जांच करने के लिए सेट किया है।
  2. जब तक प्रसंस्करण समाप्त नहीं हो जाता, तब तक सर्वर "200 OK" के साथ स्थिति प्रश्नों का जवाब देता है और कुछ प्रतिक्रिया डेटा नौकरी की स्थिति दिखाती है।
  3. प्रसंस्करण समाप्त होने के बाद, सर्वर अंतिम परिणाम के लिए URI युक्त "303 अन्य देखें" और "स्थान" के साथ स्थिति प्रश्नों का जवाब देता है।

2

संसाधन के लिए HTTP स्थिति कोड अभी तक उपलब्ध नहीं है , 404 प्रतिक्रिया के बजाय 409 प्रतिक्रिया की वापसी का सुझाव देता है, इस मामले में कि एक संसाधन मौजूद नहीं है क्योंकि यह उत्पन्न होने के बीच में है।

से w3 कल्पना :

10.4.10 409 संघर्ष

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

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

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

यह थोड़ा अजीब है, क्योंकि 409 कोड "केवल उन स्थितियों में अनुमत है जहां यह उम्मीद की जाती है कि उपयोगकर्ता संघर्ष को हल करने और अनुरोध को फिर से शुरू करने में सक्षम हो सकता है।" मेरा सुझाव है कि प्रतिक्रिया निकाय में एक संदेश शामिल है (संभवतः आपके एपीआई के बाकी हिस्सों से मेल खाते हुए कुछ प्रतिक्रिया स्वरूप में), "यह संसाधन वर्तमान में उत्पन्न हो रहा है। यह [TIME] पर आरंभ किया गया था और [TIME] पर पूरा होने का अनुमान है। बाद में पुन: प्रयास करें।"

ध्यान दें कि मैं केवल 409 दृष्टिकोण का सुझाव दूंगा यदि यह अत्यधिक संभावना है कि जो उपयोगकर्ता संसाधन का अनुरोध कर रहा है, वह उपयोगकर्ता भी है जिसने उस संसाधन का उत्पादन शुरू किया है। संसाधन की पीढ़ी के साथ शामिल नहीं होने वाले उपयोगकर्ताओं को 404 त्रुटि कम भ्रामक लगेगी।


एक खिंचाव की तरह लगता है कि 409 वास्तव में किसके लिए है, जो एक पुट के जवाब में है।
एंडी

@Andy: सच है, लेकिन इसलिए हर दूसरे विकल्प है। उदाहरण के लिए, 202 वास्तव में अनुरोध के लिए एक प्रतिक्रिया है, जिसने प्रसंस्करण शुरू किया, उस अनुरोध से नहीं जो प्रसंस्करण के परिणामों का अनुरोध करता है। वास्तव में, सबसे अधिक कल्पना-युक्त प्रतिक्रिया 404 है, क्योंकि संसाधन नहीं मिला था (क्योंकि यह अभी तक मौजूद नहीं था)। 404 प्रतिक्रिया के भीतर प्रासंगिक एपीआई डेटा प्रदान करने से एपीआई को रोकना कुछ भी नहीं है। आपका मन करता है, 4xx / 5xx प्रतिक्रियाओं का उपभोग करने के लिए कष्टप्रद हो; कुछ भाषाएँ केवल एक अलग स्थिति कोड प्रदान करने के बजाय एक अपवाद को आग लगा देंगी।
ब्रायन

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