एक वैध अनुरोध लेकिन एक खाली डेटा के लिए उचित REST प्रतिक्रिया कोड क्या है?


331

उदाहरण के लिए आप के लिए एक GET अनुरोध चलाते हैं users/9 लेकिन आईडी # 9 के साथ कोई उपयोगकर्ता नहीं है। सबसे अच्छा प्रतिक्रिया कोड कौन सा है?

  • 200 ठीक है
  • 202 स्वीकार किए जाते हैं
  • 204 कोई सामग्री नहीं
  • 400 गलत अनुरोध
  • 404 नहीं मिला

19
संकेत: क्या आपने उपयोगकर्ता 9 पाया?
क्रिस Pfohl

42
संकेत 2: तो उपयोगकर्ता 9 नहीं मिला ?
टॉमाज़ नर्कविक्ज़ जूल

18
@ आईएमबी 204 कौन कह रहा है? "कोई सामग्री नहीं" इंगित करता है कि आप जिस इकाई की तलाश कर रहे हैं वह मौजूद है, लेकिन उसका कोई प्रतिनिधित्व नहीं है। उदाहरण के लिए यदि आईडी 15 वाले ब्लॉग में कोई टिप्पणी नहीं है, और आप ब्लॉग नंबर 15 की टिप्पणियों के लिए एक खाली सूची नहीं लौटना चाहते हैं: "/ ब्लॉग / 15 / टिप्पणियाँ" NoContent लौटेगी। दूसरी ओर यदि ब्लॉग 15 मौजूद है, तो '404 Not Found' अधिक उपयुक्त है।
क्रिस पफोहल

12
@ क्रिस्पोल का मतलब आप नहीं था "। दूसरी तरफ अगर ब्लॉग 15 मौजूद नहीं है, तो '404 नहीं मिला' अधिक उपयुक्त है"
गॉर्डन मोनिका को

15
मैंने सबसे निश्चित रूप से @gdoron किया! :) धन्यवाद। अफसोस की बात है कि मुझे इसे संपादित करने और ठीक करने में लगभग तीन साल बहुत देर हो गई
क्रिस Pfohl

जवाबों:


249

टीएल; डीआर: उपयोग 404

यह ब्लॉग देखें । यह इसे बहुत अच्छी तरह से समझाता है।

ब्लॉग की टिप्पणियों का सारांश 204:

  1. 204 No Content किसी ब्राउज़र के लिए प्रतिक्रिया कोड के रूप में बहुत उपयोगी नहीं है (हालांकि HTTP कल्पना के अनुसार ब्राउज़र को इसे 'व्यू चेंज' प्रतिक्रिया कोड के रूप में समझने की आवश्यकता नहीं है)।
  2. 204 No Content है तथापि, ajax वेब सेवाओं जो कुछ वापस लौटे बिना सफलता इंगित करने के लिए चाहते हो सकता है के लिए बहुत उपयोगी। (मामलों की तरह विशेष रूप से में DELETEया POSTरों प्रतिक्रिया की आवश्यकता नहीं है कि)।

इसलिए, आपके प्रश्न का उत्तर 404आपके मामले में उपयोग किया जाता है । 204एक विशेष रिपॉजिट कोड है जिसे आप अक्सर एक के जवाब में एक ब्राउज़र पर नहीं लौटना चाहिएGET

अन्य प्रतिक्रिया कोड जो इससे भी कम उपयुक्त हैं 204और 404:

  1. 200जो भी आपने सफलतापूर्वक प्राप्त किया है उसके शरीर के साथ वापस आ जाना चाहिए। उपयुक्त नहीं है जब आपके द्वारा लाया जा रहा अस्तित्व मौजूद नहीं है।
  2. 202उपयोग किया जाता है जब सर्वर ने किसी ऑब्जेक्ट पर काम शुरू कर दिया है, लेकिन ऑब्जेक्ट अभी तक पूरी तरह से तैयार नहीं है। निश्चित रूप से यहां मामला नहीं है। आपने शुरू नहीं किया है, न ही आप शुरू करेंगे, एक GETअनुरोध के जवाब में उपयोगकर्ता 9 का निर्माण । जो सभी तरह के नियमों को तोड़ता है।
  3. 400एक खराब स्वरूपित HTTP अनुरोध के जवाब में उपयोग किया जाता है (उदाहरण के लिए विकृत हेडर, गलत तरीके से ऑर्डर किए गए सेगमेंट इत्यादि)। यह लगभग निश्चित रूप से आपके द्वारा उपयोग किए जा रहे ढांचे के द्वारा नियंत्रित किया जाएगा। जब तक आप अपने खुद के सर्वर को स्क्रैच से नहीं लिखेंगे, आपको इससे निपटना नहीं चाहिए। संपादित करें : नए RFCs अब 400 को शब्दार्थ रूप से अमान्य अनुरोधों के लिए उपयोग करने की अनुमति देते हैं।

HTTP स्टेटस कोड्स का विकिपीडिया का विवरण विशेष रूप से सहायक है। आप HTTP / 1.1 RFC2616 दस्तावेज़ की परिभाषाएँ www.w3.org पर भी देख सकते हैं


8
नोट: 200 के दशक में प्रतिक्रिया कोड सफलता का संकेत देते हैं। 400 के दशक में प्रतिक्रिया कोड विफलता का संकेत देते हैं। सारांश, अंक एक और दो, 204प्रतिक्रिया कोड (कोई सामग्री) के बारे में हैं।
क्रिस Pfohl

227
-1 के रूप में मैं भी एक सफल कॉल की प्रतिक्रिया के रूप में 404 का पुरजोर विरोध करता हूं जिसका वापस लौटने का कोई रिकॉर्ड नहीं है। एक गैर-वेब ऐप के लिए एपीआई के साथ काम करने वाले एक डेवलपर के रूप में, मैंने एपीआई के डेवलपर्स से संपर्क करने के लिए घंटों का समय बर्बाद कर दिया है कि जिस एपीआई एंडपॉइंट को मैं कॉल कर रहा था वह मौजूद नहीं था, जब वास्तव में ऐसा किया था, तो यह अभी नहीं था रिपोर्ट करने के लिए डेटा। 204 के संबंध में एक ब्राउज़र के लिए विशेष रूप से उपयोगी नहीं होने के कारण, यह थोड़ा सा है जैसे कि पूंछ कुत्ते को छेड़ना जैसा कि हमारे स्मार्ट उपकरणों के ब्रह्मांड में एपीआई एंडपॉइंट के अधिकांश उपयोग ब्राउज़र आधारित नहीं हैं और जो संभवतः AJAX का उपयोग करते हैं। हालांकि अंक दूर ले जाने के लिए क्षमा करें।
मैट कैसहेट

38
@MatthewPatrickCashatt आप कृपया नीचे उतने ही स्वतंत्र हैं जितना आप चाहते हैं। मैं अब अंत में समझता हूं कि लोग मुझे क्यों नीचा दिखा रहे हैं, लेकिन तर्क अभी भी गलत है। 404 प्राप्त करते समय इसका मतलब यह नहीं है कि मार्ग का कोई मतलब नहीं है, इसका मतलब है कि उस स्थान पर कोई संसाधन नहीं है। पूर्ण विराम। यह सच है अगर आप अनुरोध कर रहे हैं /badurlया /user/9जब ऐसा उपयोगकर्ता मौजूद नहीं है। एक डेवलपर 'नॉट फाउंड' की तुलना में बेहतर कारण वाक्यांश जोड़कर मदद कर सकता है, लेकिन इसकी आवश्यकता नहीं है।
क्रिस Pfohl

19
@ क्रिस्पोल मैं असहमति के लिए इच्छुक हूं (हालांकि डाउनवोट नहीं है, पढ़ते रहें) , विशेष रूप से डब्ल्यू 4 की परिभाषा के आधार पर , विशेष रूप से The server has not found anything matching the Request-URI। वेब / एप्लिकेशन सर्वर ने वास्तव में अनुरोध-यूआरआई से मेल खाता एक सक्रियकरण पाया है, हालांकि डीबी सर्वर ने नहीं किया है। हालाँकि, यह भी कहता है This status code is commonly used when [...] no other response is applicable, इसलिए मुझे लगता है कि इसके उपयोग को कुछ हद तक मान्य करता है (भले ही मैं इससे सहमत / पसंद न हो)।
ड्विन

8
मुझे नहीं लगता कि आप उस बिंदु को संबोधित कर रहे हैं जो मैं बना रहा हूं: एक 404 खतरनाक रूप से भ्रमित है। कॉल करने वाले को एक कारण वाक्यांश या प्रतिक्रिया के शरीर की जाँच करने का मतलब है कि आप स्थिति कोड पर भरोसा नहीं कर रहे हैं, जिस स्थिति में यह उपयोगी नहीं है।
एड्रियन बेकर

364

मैं खाली डेटा के साथ 204 या 200 के पक्ष में 404 का पुरजोर विरोध करता हूं। या कम से कम एक को 404 के साथ प्रतिक्रिया इकाई का उपयोग करना चाहिए।

अनुरोध प्राप्त हुआ और ठीक से संसाधित किया गया - इसने सर्वर पर एप्लिकेशन कोड को ट्रिगर किया, इस प्रकार कोई वास्तव में यह नहीं कह सकता है कि यह एक क्लाइंट त्रुटि थी और इस प्रकार क्लाइंट त्रुटि कोड (4xx) की पूरी कक्षा फिटिंग नहीं है।

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

यह घातक हो सकता है: अपनी कंपनी में एक लेखा सेवा की कल्पना करें जो उन सभी कर्मचारियों को सूचीबद्ध करती है जो एक वार्षिक बोनस के कारण हैं। दुर्भाग्य से, एक समय जब इसे कहा जाता है यह 404 रिटर्न करता है। क्या इसका मतलब यह है कि कोई भी एक बोनस के कारण नहीं है, या यह कि वर्तमान में एक नई तैनाती के लिए आवेदन नीचे है?

-> उन अनुप्रयोगों के लिए जो अपने डेटा की गुणवत्ता के बारे में परवाह करते हैं, प्रतिक्रिया इकाई के बिना 404 इसलिए बहुत ज्यादा है एक नहीं।

इसके अलावा, कई ग्राहक चौखटे एक 404 का जवाब देते हैं, जिसमें आगे कोई प्रश्न नहीं पूछा गया है। यह क्लाइंट डेवलपर को उस अपवाद को पकड़ने के लिए, उसका मूल्यांकन करने के लिए मजबूर करता है, और फिर उसके आधार पर यह तय करना है कि क्या इसे एक त्रुटि के रूप में लॉग इन करना है जैसे कि एक निगरानी घटक या इसे अनदेखा करना है। यह मेरे लिए बहुत सुंदर नहीं लगता है।

204 से अधिक 404 का लाभ यह है कि यह एक प्रतिक्रिया इकाई वापस कर सकता है जिसमें कुछ जानकारी हो सकती है कि अनुरोधित संसाधन क्यों नहीं मिला। लेकिन अगर यह वास्तव में प्रासंगिक है, तो कोई 200 ओके प्रतिक्रिया का उपयोग करने पर भी विचार कर सकता है और सिस्टम को इस तरह से डिजाइन कर सकता है जो पेलोड डेटा में त्रुटि प्रतिक्रियाओं के लिए अनुमति देता है। वैकल्पिक रूप से, कोई भी कॉलर को संरचित जानकारी वापस करने के लिए 404 प्रतिक्रिया के पेलोड का उपयोग कर सकता है। यदि वह XML या JSON के बजाय उदाहरण के लिए एक html पृष्ठ प्राप्त करता है जिसे वह पार्स कर सकता है, तो यह एक अच्छा संकेतक है कि कुछ तकनीकी "गलत परिणाम" उत्तर के बजाय गलत हो गया जो कॉल करने वाले के दृष्टिकोण से मान्य हो सकता है। या उसके लिए एक HTTP प्रतिक्रिया हेडर का उपयोग किया जा सकता है।

हालांकि मैं खाली प्रतिक्रिया के साथ 204 या 200 पसंद करूंगा। इस तरह अनुरोध के तकनीकी निष्पादन की स्थिति अनुरोध के तार्किक परिणाम से अलग हो जाती है। 2xx का अर्थ है "तकनीकी निष्पादन ठीक है, यह परिणाम है, इससे निपटें"।

मुझे लगता है कि ज्यादातर मामलों में ग्राहक को यह तय करना चाहिए कि खाली परिणाम स्वीकार्य है या नहीं। एक सही तकनीकी निष्पादन के बावजूद प्रतिक्रिया इकाई के बिना 404 वापस करके ग्राहक उन मामलों पर विचार करने का निर्णय ले सकता है जो केवल त्रुटियां हैं।

एक और त्वरित सादृश्य: "कोई परिणाम नहीं मिला" के लिए 404 लौटना एक डेटाबेस क्वेरी को फेंकने जैसा है यदि SQL क्वेरी ने कोई परिणाम वापस किया हो। यह काम पूरा कर सकता है, लेकिन बहुत सारे संभावित तकनीकी कारण हैं जो समान अपवाद को फेंक देते हैं जो फिर एक वैध परिणाम के लिए गलत होगा।


30
'नहीं मिला' के तकनीकी कारणों को सर्वर त्रुटियों के रूप में भी जाना जाता है। वे 500 के दशक में होना चाहिए। विशेष रूप से: "सेवा नहीं मिल सकती है" है503 Service Unavailable
क्रिस Pfohl

43
पूछने वाला एक विशिष्ट संसाधन के बारे में भी पूछ रहा था: एकल उपयोगकर्ता (नहीं) /users मार्ग , लेकिन /users/9, "# 9 के रूप में जाना जाने वाला उपयोगकर्ता"), इसलिए आपका 'खाली परिणाम सेट' तुलना समझ में नहीं आता है। 404 का अर्थ है कि वस्तु मौजूद नहीं है।
क्रिस Pfohl

29
404 बस इंगित करता है कि अनुरोध किया संसाधन (इस मामले में उपयोगकर्ता संख्या 9) नहीं मिला। इसका एप्लिकेशन कोड निकाल दिया गया था या नहीं, इससे कोई लेना-देना नहीं है, इसका इस बात से कोई लेना-देना नहीं है कि बैकएंड एप्लिकेशन का जवाब दिया गया है या नहीं। एक वेब सर्वर वह है जो प्रश्न के बारे में था, प्रश्न में रिवर्स प्रॉक्सिंग का कोई उल्लेख नहीं था।
क्रिस Pfohl

29
इस जवाब में तर्क बहुत गलत है।
कर्ट स्पिंडलर

20
404: क्लाइंट किसी दिए गए सर्वर के साथ संवाद करने में सक्षम था, लेकिन सर्वर को वह नहीं मिला, जो अनुरोध किया गया था। शाब्दिक रूप से: अनुरोध प्राप्त हुआ, यह ठीक था और ठीक से प्रारूपित था (खराब अनुरोध 400), यह प्रमाणित या सार्वजनिक था (अनधिकृत 401 / निषिद्ध 403), कोई भुगतान आवश्यक (भुगतान आवश्यक 402), अनुरोध विधि ठीक थी (विधि 405 की अनुमति नहीं थी) ), अनुरोध स्वीकार संतुष्ट हो सकता है (स्वीकार्य 406 नहीं)। उपयोगकर्ता द्वारा संसाधन प्राप्त करने पर 200 Ok का उपयोग किया जाना चाहिए। खाली संसाधन नहीं है। 400 रेंज क्लाइंट त्रुटियों के लिए है 500 सर्वर सर्वर त्रुटियों के लिए है। संक्षेप में: आपका तर्क बंद है।
डर्क-जन

62

सबसे पहले, मैंने सोचा था कि 204 समझ में आएगा, लेकिन चर्चा के बाद, मेरा मानना ​​है कि 404 एकमात्र सही सही प्रतिक्रिया है। निम्नलिखित आंकड़ों पर विचार करें:

उपयोगकर्ता: जॉन, पीटर

METHOD  URL                      STATUS  RESPONSE
GET     /users                   200     [John, Peter]
GET     /users/john              200     John
GET     /users/kyle              404     Not found
GET     /users?name=kyle`        200     []
DELETE  /users/john              204     No Content

कुछ पृष्ठभूमि:

  1. खोज एक सरणी देता है, इसमें बस कोई मिलान नहीं है लेकिन इसमें सामग्री है: एक खाली सरणी

  2. 404 बेशक यूआरएल के लिए सबसे अच्छी तरह से जाना जाता है जो अनुरोधित सर्वर द्वारा समर्थित नहीं है, लेकिन एक लापता संसाधन वास्तव में एक ही है।
    भले ही उपयोगकर्ता के /users/:nameसाथ मेल खाता हो users/kyle, लेकिन Kyle उपलब्ध संसाधन नहीं है इसलिए 404 अभी भी लागू होता है। यह एक खोज क्वेरी नहीं है, यह एक गतिशील यूआरएल द्वारा एक सीधा संदर्भ है , इसलिए यह 404 है।

वैसे भी, मेरे दो सेंट :)


9
REST API के लिए इस शैली के पीछे मेरा वजन फेंकना। किसी भी ग्राहक को / उपयोगकर्ताओं / काइल के लिए नहीं पूछना चाहिए जब तक कि यह नहीं बताया गया था कि संसाधन कॉल के माध्यम से मौजूद होगा / उपयोगकर्ताओं या / उपयोगकर्ताओं के लिए? नाम = केली
गैरी बार्कर

@GaryBarker लेकिन चूंकि यह किसी प्रकार का "उपयोगकर्ता इनपुट" है, इसलिए एपीआई को अभी भी इसे सही तरीके से संभालना है। जब आपको अपने ग्राहक में 404 को रोकना चाहिए, तो आपको इस बात की गारंटी नहीं दी जा सकती है कि यह वास्तव में पहले स्थान पर जांचा गया था। एपीआई को डिजाइन करना आपके क्लाइंट के सटीक कार्यान्वयन पर विचार किए बिना किया जाना चाहिए, विशेष रूप से चेक किए गए उपयोगकर्ता इनपुट के संदर्भ में।
RicoBrassers

यह वह उत्तर है जिससे मैं सबसे अधिक सहमत हूं। एपीआई कैसे काम करना चाहते हैं, इसका सही उदाहरण। @ गैरीबर्कर की टिप्पणी भी एकदम सही है। जब आप आईडी द्वारा कुछ देखते हैं तो यह एक त्रुटि है और यह मौजूद नहीं है। आपको पता होना चाहिए कि कॉल करने से पहले आईडी मौजूद है। ज्यादातर क्योंकि कुछ 'सफल' खाली प्रतिक्रिया मिलने से सड़क के नीचे त्रुटि हो जाती है, शायद कुछ उपयोगकर्ता'नाम या कुछ करते समय 'अपरिभाषित की संपत्ति का नाम नहीं पढ़ सकते हैं।
जेमी ट्वेल्स

दो के संयोजन के बारे में क्या। मान लें कि उपयोगकर्ताओं के पास मित्र हैं। / उपयोगकर्ताओं / केली / मित्र? नाम = fred। काइल मौजूद नहीं है, तो क्या यह प्रतिक्रिया 404 होगी? या यह 200 होगा क्योंकि हम काइल के बारे में बिल्कुल परवाह नहीं करते हैं, हम केवल नाम के साथ उसके दोस्तों की खोज के बारे में परवाह करते हैं?
23

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

23

यदि यह उम्मीद की जाती है कि संसाधन मौजूद है, लेकिन यह खाली हो सकता है, तो मैं यह तर्क दूंगा कि प्रतिनिधित्व को इंगित करने के साथ 200 ओके प्राप्त करना आसान हो सकता है जो इंगित करता है कि बात खाली है।

इसलिए मेरे पास / चीज़ों के साथ 200 ओके {"आइटम": []} के साथ 204 की तुलना में कुछ भी नहीं है, क्योंकि इस तरह 0 आइटम के साथ एक संग्रह को एक या एक के साथ एक संग्रह के रूप में एक ही माना जा सकता है इसमें और अधिक आइटम।

मैं सिर्फ 204 PUTs और DELETEs के लिए कोई सामग्री नहीं छोड़ूंगा, जहां यह मामला हो सकता है कि वास्तव में कोई उपयोगी प्रतिनिधित्व नहीं है।

इस मामले में कि / चीज / 9 वास्तव में मौजूद नहीं है, एक 404 उपयुक्त है।


1
ऐसा लगता है कि आप RPC नामक एक अधिक अमूर्त रूप का उपयोग करके एपीआई के खिलाफ प्रोग्राम करना पसंद करते हैं। क्रियाओं को बारीकी से देखने के बाद संसाधनों का उपयोग और संसाधन आधारित url जैसे कि customers/1/addressbook, RPC तरीका एक समापन बिंदु को कॉल करने के लिए है GetCustomerAddressBookऔर या तो डेटा या अनिवार्य रूप से शून्य प्राप्त करते हैं और HTTP की जटिलताओं के बारे में इतनी चिंता करने की ज़रूरत नहीं है। दोनों के पक्ष और विपक्ष हैं।
मफिन मैन

2
@ द मफिन मैन, मुझे यकीन नहीं है कि आप यह जानने का नाटक कैसे कर सकते हैं कि मैं REST या RPC पसंद करता हूं, और न ही यह चर्चा क्यों प्रासंगिक है कि HTTP GET अनुरोध करने के लिए किस स्थिति कोड को वापस करना है।
j0057

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

22

पिछली परियोजनाओं में, मैंने 404 का उपयोग किया है। यदि कोई उपयोगकर्ता 9 नहीं है, तो ऑब्जेक्ट नहीं मिला। इसलिए 404 Not Found उचित है।

ऑब्जेक्ट के लिए मौजूद है, लेकिन कोई डेटा नहीं है, 204 कोई सामग्री उपयुक्त नहीं होगी। मुझे लगता है कि आपके मामले में, वस्तु मौजूद नहीं है।


14

W3 पोस्ट के अनुसार ,

200 ठीक है

अनुरोध सफल हुआ। प्रतिक्रिया के साथ लौटी जानकारी अनुरोध में प्रयुक्त विधि पर निर्भर है

202 स्वीकार किए जाते हैं

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

204 कोई सामग्री नहीं

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

400 गलत अनुरोध

विकृत सिंटैक्स के कारण सर्वर द्वारा अनुरोध को समझा नहीं जा सका। ग्राहक बिना संशोधनों के अनुरोध को नहीं दोहराएगा

अनधिकृत 401

अनुरोध को उपयोगकर्ता प्रमाणीकरण की आवश्यकता है। प्रतिक्रिया में डब्ल्यूडब्ल्यूडब्ल्यू-ऑथेंटिकेट हेडर फ़ील्ड शामिल होना चाहिए

404 नहीं मिला

सर्वर को अनुरोध-यूआरआई से मेल खाते हुए कुछ भी नहीं मिला है। कोई संकेत नहीं दिया जाता है कि क्या स्थिति अस्थायी या स्थायी है


W3 पोस्ट HTTP स्टेटस कोड के बारे में है। HTTP REST के समान नहीं है। REST ज्यादातर लेकिन जरूरी नहीं कि HTTP एक ट्रांसपोर्ट प्रोटोकॉल के रूप में इस्तेमाल हो। 404 एक HTTP ट्रांसपोर्ट एरर कोड है। यदि REST HTTP के समान होगा, तो क्या इसे HTTP नहीं कहा जाना चाहिए?
anneb

1
@anneb जैसा कि आपने कहा कि REST HTTP का उपयोग करता है इसलिए यह उत्तर पूरी तरह से समझ में आता है। REST HTTP नहीं है, REST वैसे भी एक प्रोटोकॉल नहीं है। इस उत्तर के लिए REST को समरूप (या HTTP के समान) करने की आवश्यकता नहीं है, क्योंकि यह अर्थ नहीं है।
कोरे तुगे

@Koray Tugay: Google खोज भी http का उपयोग करता है, इसलिए इस उत्तर के अनुसार Google खोज को http स्थिति 404 का जवाब देना चाहिए यदि खोज में कुछ भी मेल नहीं खाता है?
1936

@anneb क्या Google खोज आप एक ईमानदार आवेदन का उल्लेख है? मुझे नहीं लगता .. इसलिए जवाब नहीं होगा। मूल प्रश्न पर वापस जाएँ और खरगोश के छेद में गिरने के बजाय इसका उत्तर दें .. यदि Google खोज एक दिन एक RESTful API बनाता है (या शायद यह पहले से ही है, मुझे नहीं पता) यह 204 No Contentतब वापस आ सकता है जब इसे कोई परिणाम नहीं मिलता है। नहीं 404, इसका आपके लिए परिणाम है, लेकिन इसकी कोई सामग्री नहीं है ..
कोरे तुगे

13

संक्षेप या सरल बनाने के लिए,

2xx: वैकल्पिक डेटा: अच्छी तरह से गठित URI: मानदंड URI का हिस्सा नहीं है: यदि मापदंड वैकल्पिक है जो @RequestBody में निर्दिष्ट किया जा सकता है और @RequestParam को 2xx तक ले जाना चाहिए। उदाहरण: नाम / स्थिति के अनुसार फ़िल्टर करें

4xx: अपेक्षित डेटा: अच्छी तरह से गठित URI नहीं: मानदंड URI का हिस्सा है: यदि मानदंड अनिवार्य है जो केवल @PathVariable में निर्दिष्ट किया जा सकता है तो इसे 4xx तक ले जाना चाहिए। उदाहरण: अद्वितीय आईडी द्वारा खोज।

इस प्रकार पूछी गई स्थिति के लिए: "उपयोगकर्ता / 9" 4xx होगा (संभवतः 404) लेकिन "उपयोगकर्ताओं के लिए? नाम = सुपरमैन" 2xx (संभवतः 204) होना चाहिए


12

दो प्रश्न पूछे जाते हैं। एक शीर्षक में और एक उदाहरण में। मुझे लगता है कि इससे आंशिक रूप से विवाद की मात्रा बढ़ गई है जिसके बारे में प्रतिक्रिया उपयुक्त है।

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

इसके बजाय प्रदान किया गया उदाहरण किसी विशिष्ट वस्तु, उपयोगकर्ता, के बारे में पूछता है /users/9। यदि उपयोगकर्ता # 9 नहीं मिला है, तो कोई उपयोगकर्ता ऑब्जेक्ट वापस नहीं किया गया है। आपने एक विशिष्ट संसाधन (एक उपयोगकर्ता ऑब्जेक्ट) के लिए कहा और इसे नहीं दिया गया क्योंकि यह नहीं मिला, इसलिए 404 उपयुक्त है।

मुझे लगता है कि इस तरह से काम करने का तरीका यह है कि यदि आप बिना किसी सशर्त विवरण को शामिल किए बिना जिस तरह की अपेक्षा करते हैं, उसमें प्रतिक्रिया का उपयोग कर सकते हैं, तो 204 का उपयोग करें अन्यथा 404 का उपयोग करें।

मेरे उदाहरण में मैं यह देखने के लिए जाँच किए बिना एक खाली सूची पर पुनरावृत्ति कर सकता हूं कि उसमें सामग्री है या नहीं, लेकिन मैं किसी ऑब्जेक्ट को किसी ऑब्जेक्ट को बिना तोड़-फोड़ किए या चेक को जोड़कर देख सकता हूं कि यह शून्य है या नहीं।

यदि आप अपनी आवश्यकताओं के अनुरूप हैं, तो आप निश्चित रूप से अशक्त वस्तु पैटर्न का उपयोग करके किसी वस्तु को वापस कर सकते हैं, लेकिन यह एक और सूत्र के लिए एक चर्चा है।


9

प्रश्न में देखने के बाद, आपको इसका उपयोग 404क्यों नहीं करना चाहिए ?

RFC 7231 के आधार पर सही स्थिति कोड है204

ऊपर के खिलाड़ियों में मैंने 1 छोटी सी गलतफहमी को देखा:

1.- संसाधन है: /users

2.- /users/8संसाधन नहीं है, यह है: /usersमार्ग पैरामीटर वाला संसाधन8 , उपभोक्ता शायद इसे नोटिस नहीं कर सकता है और अंतर को नहीं जानता है, लेकिन प्रकाशक को यह जानना चाहिए और यह जानना चाहिए! ... इसलिए उसे उपभोक्ताओं के लिए एक सटीक प्रतिक्रिया वापस करनी चाहिए। अवधि।

इसलिए:

RFC के आधार पर: 404 गलत है क्योंकि संसाधन /usersपाए जाते हैं, लेकिन पैरामीटर का उपयोग करके निष्पादित तर्क को प्रतिक्रिया के रूप में वापस जाने के लिए 8कोई भी नहीं मिला content, इसलिए सही उत्तर है:204

यहां मुख्य बिंदु यह है: 404आंतरिक तर्क को संसाधित करने के लिए संसाधन भी नहीं मिला

204a: मुझे संसाधन मिला है, तर्क निष्पादित किया गया था, लेकिन मुझे रूट पैरामीटर में दिए गए आपके मानदंडों का उपयोग करते हुए कोई डेटा नहीं मिला, इसलिए मैं आपके लिए कुछ भी वापस नहीं कर सकता। क्षमा करें, अपने मापदंड सत्यापित करें और मुझे फिर से कॉल करें।

200• ठीक है मैंने संसाधन पाया, तर्क निष्पादित किया गया था (यहां तक ​​कि जब इम कुछ भी वापस करने के लिए मजबूर नहीं किया जाता है) इसे ले लो और अपनी इच्छा पर इसका उपयोग करें।

205: (एक जीईटी प्रतिक्रिया का सबसे अच्छा विकल्प) मुझे संसाधन मिला, तर्क निष्पादित किया गया, मेरे पास आपके लिए कुछ सामग्री है, इसका अच्छी तरह से उपयोग करें, ओह, वैसे यदि आप इसे एक दृश्य में साझा करने जा रहे हैं, तो कृपया इस दृश्य को ताज़ा करें इसे प्रदर्शित करें।

आशा है ये मदद करेगा।


8

जो मौजूदा उत्तर विस्तृत नहीं है, वह यह है कि इससे कोई फर्क पड़ता है कि आप पथ पैरामीटर या क्वेरी पैरामीटर का उपयोग करते हैं।

  • पथ पैरामीटर के मामले में, पैरामीटर संसाधन पथ का हिस्सा है। के मामले में /users/9, प्रतिक्रिया होनी चाहिए 404क्योंकि वह संसाधन नहीं मिला था। /users/9संसाधन है, और परिणाम एकात्मक है, या एक त्रुटि है, यह मौजूद नहीं है। यह कोई सन्यासी नहीं है।
  • क्वेरी पैरामीटर के मामले में, पैरामीटर संसाधन पथ का हिस्सा नहीं है। के मामले में /users?id=9, प्रतिक्रिया होनी चाहिए 204क्योंकि संसाधन /usersपाया गया था लेकिन यह कोई डेटा वापस नहीं कर सका। संसाधन /usersमौजूद है और परिणाम n-ary है, यह खाली होने पर भी मौजूद है। तो idअद्वितीय है, यह है एक इकाई।

पथ पैरामीटर या क्वेरी पैरामीटर का उपयोग करना है या नहीं यह उपयोग के मामले पर निर्भर करता है। मैं वैकल्पिक, गैर-मानक, या तर्कशील तर्क (जैसे पेजिंग, कोलाज लोकेल और सामान) के लिए अनिवार्य, मानक, या पहचानने वाले तर्क और क्वेरी मापदंडों के लिए पथ पैरामीटर पसंद करता हूं। REST API में, मैं "चाइल्ड रिकॉर्ड" प्राप्त करने के लिए संभावित घोंसले के शिकार होने के कारण विशेष रूप से उपयोग /users/9नहीं करूँगा, /users?id=9जैसे /users/9/ssh-keys/0कि पहली सार्वजनिक ssh कुंजी /users/9/address/2प्राप्त करना या तीसरा पोस्टल एड्रेस प्राप्त करना।

मैं 404 का उपयोग करना पसंद करता हूँ। यहाँ क्यों:

  • (1 परिणाम) और n-ary (n परिणाम) विधियों के लिए कॉल किसी अच्छे कारण के लिए भिन्न नहीं होनी चाहिए। यदि संभव हो तो मुझे एक ही प्रतिक्रिया कोड पसंद है। अपेक्षित परिणाम की संख्या निश्चित रूप से एक अंतर है, कहते हैं, आप उम्मीद करते हैं कि शरीर एक वस्तु (एकरी) या वस्तुओं की एक सरणी (n-ary) होगा।
  • एन-एरी के लिए, मैं एक सरणी लौटाऊंगा, और यदि परिणाम नहीं हैं, तो मैं कोई सेट (कोई दस्तावेज़) नहीं लौटाऊंगा, मैं एक खाली सेट (खाली दस्तावेज़, जैसे JSON में खाली सरणी या XML में खाली तत्व) वापस करूंगा )। यही है, यह अभी भी 200 है लेकिन शून्य रिकॉर्ड के साथ। इस जानकारी को शरीर के अलावा तार पर डालने का कोई कारण नहीं है।
  • 204एक voidविधि की तरह है । मैं के लिए यह प्रयोग करेंगे नहीं GET, केवल के लिए POST, PUT, और DELETE। मैं ऐसे मामले में अपवाद बनाता हूं GETजहां पहचानकर्ता क्वेरी पैरामीटर हैं पथ पैरामीटर नहीं।
  • रिकॉर्ड नहीं मिल रहा है NoSuchElementException, ArrayIndexOutOfBoundsExceptionया ऐसा कुछ है, जो क्लाइंट द्वारा किसी ऐसे आईडी का उपयोग करने के कारण होता है जो मौजूद नहीं है, इसलिए, यह एक क्लाइंट त्रुटि है।
  • एक कोड परिप्रेक्ष्य से, कोड में 204एक अतिरिक्त शाखा का मतलब है जिसे टाला जा सकता है। यह क्लाइंट कोड को जटिल करता है, और कुछ मामलों में यह सर्वर कोड को भी जटिल करता है (इस पर निर्भर करता है कि आप एंटिटी / मॉडल मोनडेस या एंटिटीज / मॉडल का उपयोग करते हैं? और मैं दृढ़ता से यूनिट / मॉडल मोनड्स से दूर रहने की सलाह देता हूं , क्योंकि यह खराब बग पैदा कर सकता है क्योंकि मोनाद के अनुसार, आपको लगता है कि एक ऑपरेशन सफल है और २०० या २०४ पर वापस लौटें जब आपको वास्तव में कुछ और लौटाना चाहिए)।
  • क्लाइंट कोड को लिखना और समझना आसान है यदि 2xx का अर्थ है कि सर्वर ने क्लाइंट से अनुरोध किया है, और 4xx का मतलब है कि सर्वर ने क्लाइंट से अनुरोध नहीं किया है और यह क्लाइंट की गलती है। क्लाइंट को यह रिकॉर्ड न देना कि आईडी द्वारा अनुरोधित ग्राहक की गलती है, क्योंकि क्लाइंट ने ऐसी आईडी का अनुरोध किया है जो मौजूद नहीं है।

अंतिम लेकिन कम से कम नहीं: संगति

  • GET /users/9
  • PUT /users/9 तथा DELETE /users/9

PUT /users/9और DELETE /users/9पहले से ही 204सफल अद्यतन या विलोपन के मामले में लौटना होगा । यदि उपयोगकर्ता 9 मौजूद नहीं थे तो उन्हें क्या लौटना चाहिए? इसका कोई मतलब नहीं है कि इस्तेमाल की गई एचटीटीपी पद्धति के आधार पर विभिन्न स्थिति कोडों के समान स्थिति प्रस्तुत की जाती है।

इसके अलावा, एक आदर्श नहीं है, लेकिन एक सांस्कृतिक कारण है: यदि परियोजना में होने वाली अगली चीज के 204लिए उपयोग किया जाता GET /users/9है, तो किसी को लगता है कि वापसी 204एन-आर्य विधियों के लिए अच्छा है। और वह क्लाइंट कोड को उलझा देता है, क्योंकि केवल 2xxशरीर की जांच करने और फिर डिकोड करने के बजाय , क्लाइंट को अब विशेष रूप से चेक करना है 204और उस स्थिति में शरीर को डिकोड करना छोड़ दें। बड इसके बजाय ग्राहक क्या करता है? एक खाली सरणी बनाएँ? तार पर क्यों नहीं है, फिर? यदि क्लाइंट खाली सरणी बनाता है, तो 204 बेवकूफ संपीड़न का एक रूप है। यदि ग्राहक nullइसके बजाय उपयोग करता है , तो कीड़े के एक पूरे अलग-अलग कैन को खोला जाता है।


5

ट्विटर "कोई डेटा नहीं मिला" जैसे कस्टम त्रुटि संदेश के साथ 404 का उपयोग करता है।

Ref: https://developer.twitter.com/en/docs/basics/response-codes.html


2
Microsoft Azure 404 का भी उपयोग करता है, लेकिन HEAD अनुरोधों का जवाब देते समय कस्टम त्रुटि संदेश संभव नहीं है। docs.microsoft.com/en-us/rest/api/resources/resources/…
माइक

3

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


यदि आपके पास बैकएंड त्रुटि है तो आपको 404 नहीं लौटाने चाहिए।
appalling22

3

मैं कहूंगा, न तो वास्तव में उचित है। जैसा कि कहा गया है - जैसे @anneb द्वारा, मुझे भी लगता है कि समस्याओं का हिस्सा एक HTTP प्रतिक्रिया कोड का उपयोग करने से उत्पन्न स्थिति से संबंधित स्थिति का परिवहन करने के लिए होता है। REST सेवा के बारे में कुछ भी कहना है कि इसके स्वयं के प्रसंस्करण के बारे में REST के विशिष्ट कोड के माध्यम से परिवहन किया जाना चाहिए।

1

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

चलिए एक पल के लिए निम्न URL मान लेते हैं http://example.com/service/return/test:।

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

सेवा से किसी भी प्रतिक्रिया के बिना स्पष्ट रूप से एक अलग व्यवहार की आवश्यकता होती है, HTTP सर्वर केवल 3 चीजें कह सकता है:

  • 503 यदि अनुरोध को संभालने वाली सेवा नहीं चल रही है या प्रतिक्रिया नहीं दे रही है;
  • 200 अन्यथा HTTP सर्वर वास्तव में अनुरोध को पूरा कर सकता है - कोई फर्क नहीं पड़ता कि सेवा बाद में क्या कहेगी;
  • 400या 404यह इंगित करने के लिए कि ऐसी कोई सेवा नहीं है (जैसा कि "मौजूद लेकिन ऑफ़लाइन" के विपरीत) और कुछ नहीं मिला।

2

प्रश्न पर वापस जाने के लिए: मुझे लगता है कि सबसे साफ तरीका यह होगा कि पहले से बताए गए स्थान के अलावा किसी अन्य पर किसी भी प्रतिक्रिया कोड का उपयोग न करें। यदि सेवा मौजूद है और प्रतिक्रिया दे रही है, तो एचटीटीपी कोड 200 होना चाहिए। प्रतिक्रिया में वह स्थिति होनी चाहिए जिसमें सेवा अलग हेडर में वापस आए - यहाँ, सेवा कह सकती है

  • REST:EMPTYजैसे अगर यह sth के लिए खोज करने के लिए कहा गया था। और वह शोध खाली लौटा;
  • REST:NOT FOUNDअगर यह विशेष रूप से sth के लिए कहा गया था। "आईडी-लाइक" - कि एक फ़ाइल का नाम या आईडी या प्रविष्टि नंबर 24, आदि द्वारा एक संसाधन - और वह विशिष्ट संसाधन नहीं मिला (आमतौर पर, एक विशिष्ट संसाधन का अनुरोध किया गया था और नहीं मिला);
  • REST:INVALID यदि अनुरोध के किसी भी भाग को भेजा गया था तो सेवा द्वारा मान्यता प्राप्त नहीं है।

(ध्यान दें कि मैंने इन्हें "REST:" के साथ उपसर्ग किया था, इस तथ्य को चिह्नित करने के लिए कि इनमें HTTP मान कोड के समान मान या शब्द हो सकते हैं, वे sth हैं। पूरी तरह से अलग हैं)

3

आइए ऊपर दिए गए URL पर वापस जाएं और केस B का निरीक्षण करें जहां सेवा HTTP सर्वर को इंगित करती है कि वह इस अनुरोध को स्वयं नहीं संभालता है, लेकिन इसे पास करता है SERVICE। HTTP केवल यह बताती है कि इसे किसके द्वारा वापस दिया गया है SERVICE, यह उस return/testहिस्से के बारे में कुछ भी नहीं जानता है जो इसके द्वारा नियंत्रित किया गया हैSERVICE । यदि वह सेवा चल रही है, तो HTTP को वापस लौटना चाहिए 200क्योंकि यह वास्तव में अनुरोध को संभालने के लिए कुछ मिला है

स्थिति SERVICE(और जैसा कि ऊपर कहा गया है, एक अलग हेडर में देखना चाहेंगे) इस बात पर निर्भर करता है कि वास्तव में क्या कार्रवाई अपेक्षित है:

  • यदि return/testकोई विशिष्ट संसाधन मांगता है: यदि यह मौजूद है, तो इसे एक स्थिति के साथ लौटाएं REST:FOUND; यदि वह संसाधन मौजूद नहीं है, तो वापस लौटें REST:NOT FOUND; REST:GONEयदि हम यह जानते हैं कि यह एक बार अस्तित्व में है और वापस नहीं लौटेगा, और REST:MOVEDयदि हम जानते हैं कि यह हॉलीवुड चला गया है , तो इसे वापस लौटने के लिए बढ़ाया जा सकता है
  • यदि return/testखोज या फ़िल्टर-जैसा ऑपरेशन माना जाता है: यदि परिणाम सेट खाली है, तो अनुरोध किए गए प्रकार और स्थिति में खाली सेट लौटाएं REST:EMPTY; अनुरोध के प्रकार और परिणामों में परिणाम का एक सेटREST:SUCCESS
  • यदि return/testइसके द्वारा पुनरावर्ती ऑपरेशन नहीं किया जाता है SERVICE: REST:ERRORयदि यह पूरी तरह से गलत है (जैसे एक टाइपो retrun/test), याREST:NOT IMPLEMENTED में इसके लिए योजना बनाई है ।

4

दो अलग-अलग चीजों को मिलाने की तुलना में यह अंतर बहुत साफ है। यह डिबगिंग को आसान बना देगा और प्रसंस्करण को थोड़ा और अधिक जटिल बना देगा, यदि बिल्कुल भी।

  • यदि कोई HTTP 404 वापस आ जाता है, तो सर्वर मुझे बताता है, "मुझे कुछ पता नहीं है कि आप किस बारे में बात कर रहे हैं"। हालांकि मेरे अनुरोध का REST भाग स्पष्ट रूप से ठीक हो सकता है, मुझे सभी गलत स्थानों में par'Mach की तलाश है।
  • दूसरी ओर, HTTP 200 और REST: ERR मुझे बताता है कि मुझे सेवा मिल गई है लेकिन सेवा के लिए मेरे अनुरोध में कुछ गलत है।
  • HTTP 200 और REST: EMPTY से, मुझे पता है कि मैंने कुछ भी गलत नहीं किया - सही सर्वर, सर्वर को सेवा मिली, सेवा के लिए सही अनुरोध - लेकिन खोज परिणाम रिक्त है।

सारांश

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

एक सेवा द्वारा संसाधित अनुरोध का राज्य और HTTP सर्वर प्रतिक्रिया नहीं (RFC 6919) HTTP प्रतिक्रिया कोड द्वारा नहीं दी जानी चाहिए। HTTP कोड SHOULD (RFC 2119) में केवल वह जानकारी होती है जो HTTP सर्वर अपने स्वयं के दायरे से दे सकता है: अर्थात्, सेवा अनुरोध को संसाधित करने के लिए मिली थी या नहीं।

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


2

RFC7231 के अनुसार - page59 ( https://tools.ietf.org/html/rfc7231#page-59 ) 404 स्थिति कोड प्रतिक्रिया की परिभाषा है:

6.5.4। 404 नहीं मिला 404 (पाया नहीं गया) स्थिति कोड इंगित करता है कि मूल सर्वर ने लक्ष्य संसाधन के लिए वर्तमान प्रतिनिधित्व नहीं पाया या यह बताने के लिए तैयार नहीं है कि कोई मौजूद है। 404 स्थिति कोड यह नहीं दर्शाता है कि प्रतिनिधित्व की यह कमी अस्थायी है या स्थायी; मूल सर्वर जानता है, तो संभवतः कुछ विन्यास योग्य साधनों के माध्यम से 410 (गया) स्थिति कोड 404 से अधिक पसंद किया जाता है, यह स्थिति स्थायी होने की संभावना है। एक 404 प्रतिक्रिया डिफ़ॉल्ट रूप से देखने योग्य है; अर्थात, जब तक कि विधि परिभाषा या स्पष्ट कैश नियंत्रण द्वारा इंगित नहीं किया जाता है (देखें [RFC7234] की धारा 4.2.2)।

और मुख्य बात जो संदेह लाती है वह उपरोक्त संदर्भ में संसाधन की परिभाषा है। उसी RFC (7231) के अनुसार संसाधन की परिभाषा है:

संसाधन: HTTP अनुरोध के लक्ष्य को "संसाधन" कहा जाता है। HTTP संसाधन की प्रकृति को सीमित नहीं करता है; यह केवल एक इंटरफेस को परिभाषित करता है जिसका उपयोग संसाधनों के साथ बातचीत करने के लिए किया जा सकता है। प्रत्येक संसाधन की पहचान यूनिफ़ॉर्म रिसोर्स आइडेंटिफ़ायर (URI) द्वारा की जाती है, जैसा कि [RFC7230] की धारा २. [में वर्णित है। जब कोई क्लाइंट HTTP / 1.1 अनुरोध संदेश का निर्माण करता है, तो यह विभिन्न रूपों में से एक में लक्ष्य URI भेजता है, जैसा कि (RFC7230] की धारा 5.3 में परिभाषित किया गया है। जब कोई अनुरोध प्राप्त होता है, तो सर्वर लक्ष्य संसाधन ([RFC7230] की धारा 5.5) के लिए एक प्रभावी अनुरोध URI का पुनर्निर्माण करता है। HTTP का एक डिज़ाइन लक्ष्य अनुरोध शब्दार्थ से संसाधन पहचान को अलग करना है, जो अनुरोध पद्धति (धारा 4) और कुछ अनुरोध-संशोधित हेडर फ़ील्ड्स (धारा 5) में अनुरोध शब्दार्थ को निहित करके संभव बनाया गया है।

तो मेरी समझ में रिक्त परिणाम के साथ सफल GET अनुरोध पर 404 स्थिति कोड का उपयोग नहीं किया जाना चाहिए। (उदाहरण: विशिष्ट परिणाम के बिना कोई सूची वाली सूची)


2

ऐसी बातें व्यक्तिपरक हो सकती हैं और दोनों पक्षों में कुछ दिलचस्प और विभिन्न ठोस तर्क हैं। हालांकि [मेरी राय में] लापता डेटा के लिए 404 लौटाना सही नहीं है । यहाँ स्पष्ट करने के लिए एक सरलीकृत विवरण दिया गया है:

  • अनुरोध: क्या मेरे पास कुछ डेटा हो सकता है?
  • संसाधन (API समापन बिंदु): मुझे आपके लिए वह अनुरोध मिलेगा, यहां [संभावित डेटा की प्रतिक्रिया भेजता है]

कुछ भी नहीं टूटा, समापन बिंदु पाया गया था, और तालिका और कॉलम पाए गए थे ताकि डीबी को चौकन्ना कर दिया गया और डेटा "सफलतापूर्वक" वापस आ गया!

अब - चाहे उस "सफल प्रतिक्रिया" में डेटा है या नहीं, इससे कोई फर्क नहीं पड़ता, आपने "संभावित" डेटा की प्रतिक्रिया मांगी और उस "संभावित" डेटा के साथ प्रतिक्रिया पूरी हुई। रिक्त, रिक्त आदि मान्य डेटा है।

200 का मतलब है कि हमने जो भी अनुरोध किया वह सफल रहा। मैं डेटा का अनुरोध कर रहा हूं, HTTP / REST के साथ कुछ भी गलत नहीं हुआ, और जैसा कि डेटा (यद्यपि खाली) मेरे "डेटा के लिए अनुरोध" को वापस कर दिया गया था।

एक 200 लौटें और प्रत्येक विशिष्ट परिदृश्य वारंट के रूप में रिक्वेस्टर को खाली डेटा के साथ सौदा करने दें!

इस उदाहरण पर विचार करें:

  • अनुरोध: उपयोगकर्ता आईडी 1234 के साथ क्वेरी "उल्लंघन" तालिका
  • संसाधन (API समापन बिंदु): एक प्रतिक्रिया देता है लेकिन डेटा खाली है

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

आपके पास कोई उल्लंघन नहीं है, एक ब्लूबेरी मफिन है!

यदि आप इसे 404 समझ रहे हैं तो आप क्या कह रहे हैं? उपयोगकर्ता के उल्लंघन नहीं मिले? अब, व्याकरणिक रूप से यह सही है, लेकिन यह केवल सही नहीं है REST दुनिया में सफलता या विफलता अनुरोध के बारे में थी। इस उपयोगकर्ता के लिए "इंफ्रैक्शन" डेटा सफलतापूर्वक पाया जा सकता है, शून्य उल्लंघन हैं - एक वास्तविक संख्या जो एक वैध स्थिति का प्रतिनिधित्व करती है।


[गाल नोट ..]

अपने शीर्षक में, आप अवचेतन रूप से सहमत हैं कि 200 सही प्रतिक्रिया है:

एक वैध अनुरोध लेकिन एक खाली डेटा के लिए उचित REST प्रतिक्रिया कोड क्या है ?


यहां कुछ बातों पर विचार करना है कि कौन सी स्थिति कोड का उपयोग करना है, भले ही विषय और ट्रिकी विकल्पों की परवाह किए बिना:

  1. संगति । यदि आप "कोई डेटा नहीं" के लिए 404 का उपयोग करते हैं, तो हर बार इसका उपयोग प्रतिक्रिया के बिना कोई डेटा नहीं होता है।
  2. एक से अधिक अर्थों के लिए समान स्थिति का उपयोग न करें । यदि आप 404 लौटाते हैं, जब एक संसाधन नहीं मिला था (उदाहरण के लिए एपीआई अंत बिंदु मौजूद नहीं है आदि) तो बिना डेटा लौटाए इसका उपयोग करें। यह सिर्फ प्रतिक्रियाओं के साथ काम करता है एक दर्द।
  3. संदर्भ पर ध्यान से विचार करें । "अनुरोध" क्या है? आप क्या कह रहे हैं आप प्राप्त करने की कोशिश कर रहे हैं?

1

एक सामान्य एनम के साथ प्रतिक्रिया सामग्री को एनकोड करें जो क्लाइंट को उस पर स्विच करने की अनुमति देता है और तदनुसार तर्क को कांटा करता है। मुझे यकीन नहीं है कि आपका ग्राहक "डेटा नहीं मिला" 404 और "वेब संसाधन नहीं मिला" 404 के बीच अंतर को कैसे परिभाषित करेगा? आप नहीं चाहते कि कोई व्यक्ति Z / 9 में ब्राउज़ करे और ग्राहक को आश्चर्य हो जैसे कि अनुरोध मान्य था लेकिन कोई डेटा वापस नहीं आया।


1

410 का उपयोग क्यों नहीं? यह सुझाव देता है कि अनुरोधित संसाधन अब मौजूद नहीं है और ग्राहक से अपेक्षा की जाती है कि वह आपके मामले में उस संसाधन के लिए कभी अनुरोध न करेusers/9

आप 410 के बारे में अधिक जानकारी यहाँ से प्राप्त कर सकते हैं: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


2
'ग्राहक से यह अपेक्षा की जाती है कि वह कभी अनुरोध न करे' - और क्या होगा यदि वह उपयोगकर्ता बाद में बनता है, तो आपका जवाब आपको यह गारंटी दे सकता है कि यह उपयोगकर्ता कभी मौजूद नहीं होगा, यह एक बहुत ही साहसिक धारणा है और गलत है
होली

होली ने क्या कहा। उसके बिंदु में जोड़ने के लिए: यदि उपयोगकर्ता मौजूद था और हटा दिया गया था, तो भी 410 गलत है, क्योंकि अगर उपयोगकर्ता अनियंत्रित हो जाता है तो क्या होगा? (किस तरह का एक विशेष मामला बाद में बनाया जाता है।)
ईसाई हुजेर

क्योंकि 410 स्थाई स्थिति होनी चाहिए। restapitutorial.com/httpstatuscodes.html
अकोस्टा

1

यह बहुत दुखद है कि इस धागे में कुछ सरल और अच्छी तरह से परिभाषित "राय आधारित" बन गया।

एक HTTP सर्वर केवल "संस्थाओं" के बारे में जानता है, जो किसी भी सामग्री के लिए एक अमूर्तता है, यह एक स्थिर वेब पेज, खोज परिणामों की एक सूची, अन्य संस्थाओं की सूची, किसी चीज़ का एक विवरण, एक मीडिया फ़ाइल, आदि।

इस तरह की प्रत्येक इकाई को एक अद्वितीय URL द्वारा पहचानने योग्य होने की उम्मीद है, जैसे

  • / उपयोगकर्ता / 9 - एक एकल इकाई: एक USER ID = 9
  • / उपयोगकर्ता - एक एकल इकाई: सभी उपयोगकर्ताओं का एक सूची
  • /media/x.mp3 - एक एकल इकाई: एक मीडिया फ़ाइल जिसे x.mp3 कहा जाता है
  • / खोज - एक एकल इकाई: क्वेरी पर आधारित डायनामिक कंटेंट

यदि कोई सर्वर दिए गए URL द्वारा संसाधन पाता है, तो इससे कोई फर्क नहीं पड़ता कि उसकी सामग्री क्या है - 2G of data, null, {}, [] - जब तक यह मौजूद है, यह 200 होगा। लेकिन अगर ऐसी इकाई है सर्वर के लिए ज्ञात नहीं है, यह 404 "नॉट फाउंड" को वापस करने के लिए उपलब्ध है।

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

भ्रम का एक और बिंदु "कोई डेटा नहीं" और "कोई इकाई" नहीं है। पूर्व एक इकाई की सामग्री के बारे में है, और बाद में इसके अस्तित्व के बारे में है।

उदाहरण 1:

  • कोई डेटा नहीं: / उपयोगकर्ताओं को 200 ठीक है, शरीर: [] क्योंकि कोई भी अभी तक पंजीकृत नहीं है
  • कोई इकाई नहीं: / उपयोगकर्ता 404 लौटाते हैं क्योंकि कोई पथ / उपयोगकर्ता नहीं है

उदाहरण 2:

  • कोई डेटा नहीं: / उपयोगकर्ता / 9 रिटर्न 200 ठीक है, शरीर: {}, क्योंकि उपयोगकर्ता आईडी = 9 ने कभी भी अपना व्यक्तिगत डेटा दर्ज नहीं किया
  • कोई इकाई नहीं: / उपयोगकर्ता / 9 404 देता है क्योंकि कोई उपयोगकर्ता आईडी = 9 नहीं है

उदाहरण 3:

  • कोई डेटा नहीं: / खोज? नाम = जो रिटर्न 200 ठीक है [], क्योंकि डीबी में जोया नहीं हैं
  • कोई इकाई नहीं: / खोज? नाम = जो 404 देता है क्योंकि कोई रास्ता / खोज नहीं है

0

404 किसी भी क्लाइंट के लिए बहुत भ्रामक होगा यदि आप सिर्फ इसलिए लौटते हैं क्योंकि प्रतिक्रिया में कोई डेटा नहीं है।

मेरे लिए, खाली शरीर के साथ रिस्पांस कोड 200 यह समझने के लिए पर्याप्त है कि सब कुछ सही है लेकिन आवश्यकताओं से मेल खाने वाला कोई डेटा नहीं है।


0

Microsoft के अनुसार: ASP.NET कोर वेब एपीआई में कंट्रोलर एक्शन रिटर्न प्रकार , लगभग नीचे तक स्क्रॉल करें, आपको डेटाबेस में नहीं मिली वस्तु से संबंधित 404 के बारे में निम्नलिखित ब्लर्ब मिलते हैं। यहां वे सुझाव देते हैं कि एक 404 खाली डेटा के लिए उपयुक्त है।

यहां छवि विवरण दर्ज करें


0

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

200 की स्थिति में संसाधन डेटा शामिल होने की उम्मीद है - इसलिए यह सही विकल्प नहीं है। 204 स्थिति का अर्थ पूरी तरह से कुछ और है और इसे GET अनुरोधों के लिए प्रतिक्रिया के रूप में उपयोग नहीं किया जाना चाहिए।

अन्य सभी मौजूदा स्थिति लागू नहीं हैं, एक कारण या दूसरे के लिए।

मैंने कई स्थानों पर इस विषय पर चर्चा की है। मेरे लिए, यह स्पष्ट रूप से स्पष्ट है कि विषय के चारों ओर भ्रम को खत्म करने के लिए, एक समर्पित सफलता की स्थिति की आवश्यकता है। कुछ ऐसा " 209 - प्रदर्शन के लिए कोई संसाधन नहीं ।

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

एकमात्र सवाल यह है: मैं इसे मानक के रूप में स्वीकार करने के लिए आरएफसी कैसे प्राप्त करूं?

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