उदाहरण के लिए आप के लिए एक GET अनुरोध चलाते हैं users/9
लेकिन आईडी # 9 के साथ कोई उपयोगकर्ता नहीं है। सबसे अच्छा प्रतिक्रिया कोड कौन सा है?
- 200 ठीक है
- 202 स्वीकार किए जाते हैं
- 204 कोई सामग्री नहीं
- 400 गलत अनुरोध
- 404 नहीं मिला
उदाहरण के लिए आप के लिए एक GET अनुरोध चलाते हैं users/9
लेकिन आईडी # 9 के साथ कोई उपयोगकर्ता नहीं है। सबसे अच्छा प्रतिक्रिया कोड कौन सा है?
जवाबों:
टीएल; डीआर: उपयोग 404
यह ब्लॉग देखें । यह इसे बहुत अच्छी तरह से समझाता है।
ब्लॉग की टिप्पणियों का सारांश 204
:
204 No Content
किसी ब्राउज़र के लिए प्रतिक्रिया कोड के रूप में बहुत उपयोगी नहीं है (हालांकि HTTP कल्पना के अनुसार ब्राउज़र को इसे 'व्यू चेंज' प्रतिक्रिया कोड के रूप में समझने की आवश्यकता नहीं है)।204 No Content
है तथापि, ajax वेब सेवाओं जो कुछ वापस लौटे बिना सफलता इंगित करने के लिए चाहते हो सकता है के लिए बहुत उपयोगी। (मामलों की तरह विशेष रूप से में DELETE
या POST
रों प्रतिक्रिया की आवश्यकता नहीं है कि)।इसलिए, आपके प्रश्न का उत्तर 404
आपके मामले में उपयोग किया जाता है । 204
एक विशेष रिपॉजिट कोड है जिसे आप अक्सर एक के जवाब में एक ब्राउज़र पर नहीं लौटना चाहिएGET
।
अन्य प्रतिक्रिया कोड जो इससे भी कम उपयुक्त हैं 204
और 404
:
200
जो भी आपने सफलतापूर्वक प्राप्त किया है उसके शरीर के साथ वापस आ जाना चाहिए। उपयुक्त नहीं है जब आपके द्वारा लाया जा रहा अस्तित्व मौजूद नहीं है।202
उपयोग किया जाता है जब सर्वर ने किसी ऑब्जेक्ट पर काम शुरू कर दिया है, लेकिन ऑब्जेक्ट अभी तक पूरी तरह से तैयार नहीं है। निश्चित रूप से यहां मामला नहीं है। आपने शुरू नहीं किया है, न ही आप शुरू करेंगे, एक GET
अनुरोध के जवाब में उपयोगकर्ता 9 का निर्माण । जो सभी तरह के नियमों को तोड़ता है।400
एक खराब स्वरूपित HTTP अनुरोध के जवाब में उपयोग किया जाता है (उदाहरण के लिए विकृत हेडर, गलत तरीके से ऑर्डर किए गए सेगमेंट इत्यादि)। यह लगभग निश्चित रूप से आपके द्वारा उपयोग किए जा रहे ढांचे के द्वारा नियंत्रित किया जाएगा। जब तक आप अपने खुद के सर्वर को स्क्रैच से नहीं लिखेंगे, आपको इससे निपटना नहीं चाहिए। संपादित करें : नए RFCs अब 400 को शब्दार्थ रूप से अमान्य अनुरोधों के लिए उपयोग करने की अनुमति देते हैं।HTTP स्टेटस कोड्स का विकिपीडिया का विवरण विशेष रूप से सहायक है। आप HTTP / 1.1 RFC2616 दस्तावेज़ की परिभाषाएँ www.w3.org पर भी देख सकते हैं
204
प्रतिक्रिया कोड (कोई सामग्री) के बारे में हैं।
/badurl
या /user/9
जब ऐसा उपयोगकर्ता मौजूद नहीं है। एक डेवलपर 'नॉट फाउंड' की तुलना में बेहतर कारण वाक्यांश जोड़कर मदद कर सकता है, लेकिन इसकी आवश्यकता नहीं है।
The server has not found anything matching the Request-URI
। वेब / एप्लिकेशन सर्वर ने वास्तव में अनुरोध-यूआरआई से मेल खाता एक सक्रियकरण पाया है, हालांकि डीबी सर्वर ने नहीं किया है। हालाँकि, यह भी कहता है This status code is commonly used when [...] no other response is applicable
, इसलिए मुझे लगता है कि इसके उपयोग को कुछ हद तक मान्य करता है (भले ही मैं इससे सहमत / पसंद न हो)।
मैं खाली डेटा के साथ 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 क्वेरी ने कोई परिणाम वापस किया हो। यह काम पूरा कर सकता है, लेकिन बहुत सारे संभावित तकनीकी कारण हैं जो समान अपवाद को फेंक देते हैं जो फिर एक वैध परिणाम के लिए गलत होगा।
503 Service Unavailable
।
/users
मार्ग , लेकिन /users/9
, "# 9 के रूप में जाना जाने वाला उपयोगकर्ता"), इसलिए आपका 'खाली परिणाम सेट' तुलना समझ में नहीं आता है। 404 का अर्थ है कि वस्तु मौजूद नहीं है।
सबसे पहले, मैंने सोचा था कि 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
कुछ पृष्ठभूमि:
खोज एक सरणी देता है, इसमें बस कोई मिलान नहीं है लेकिन इसमें सामग्री है: एक खाली सरणी ।
404 बेशक यूआरएल के लिए सबसे अच्छी तरह से जाना जाता है जो अनुरोधित सर्वर द्वारा समर्थित नहीं है, लेकिन एक लापता संसाधन वास्तव में एक ही है।
भले ही उपयोगकर्ता के /users/:name
साथ मेल खाता हो users/kyle
, लेकिन Kyle उपलब्ध संसाधन नहीं है इसलिए 404 अभी भी लागू होता है। यह एक खोज क्वेरी नहीं है, यह एक गतिशील यूआरएल द्वारा एक सीधा संदर्भ है , इसलिए यह 404 है।
वैसे भी, मेरे दो सेंट :)
यदि यह उम्मीद की जाती है कि संसाधन मौजूद है, लेकिन यह खाली हो सकता है, तो मैं यह तर्क दूंगा कि प्रतिनिधित्व को इंगित करने के साथ 200 ओके प्राप्त करना आसान हो सकता है जो इंगित करता है कि बात खाली है।
इसलिए मेरे पास / चीज़ों के साथ 200 ओके {"आइटम": []} के साथ 204 की तुलना में कुछ भी नहीं है, क्योंकि इस तरह 0 आइटम के साथ एक संग्रह को एक या एक के साथ एक संग्रह के रूप में एक ही माना जा सकता है इसमें और अधिक आइटम।
मैं सिर्फ 204 PUTs और DELETEs के लिए कोई सामग्री नहीं छोड़ूंगा, जहां यह मामला हो सकता है कि वास्तव में कोई उपयोगी प्रतिनिधित्व नहीं है।
इस मामले में कि / चीज / 9 वास्तव में मौजूद नहीं है, एक 404 उपयुक्त है।
customers/1/addressbook
, RPC तरीका एक समापन बिंदु को कॉल करने के लिए है GetCustomerAddressBook
और या तो डेटा या अनिवार्य रूप से शून्य प्राप्त करते हैं और HTTP की जटिलताओं के बारे में इतनी चिंता करने की ज़रूरत नहीं है। दोनों के पक्ष और विपक्ष हैं।
W3 पोस्ट के अनुसार ,
200 ठीक है
अनुरोध सफल हुआ। प्रतिक्रिया के साथ लौटी जानकारी अनुरोध में प्रयुक्त विधि पर निर्भर है
202 स्वीकार किए जाते हैं
प्रसंस्करण के लिए अनुरोध स्वीकार कर लिया गया है, लेकिन प्रसंस्करण पूरा नहीं हुआ है।
204 कोई सामग्री नहीं
सर्वर ने अनुरोध को पूरा कर लिया है, लेकिन उसे निकाय-निकाय को वापस करने की आवश्यकता नहीं है, और अद्यतन मेटैनफॉर्मेशन वापस करना चाह सकता है।
400 गलत अनुरोध
विकृत सिंटैक्स के कारण सर्वर द्वारा अनुरोध को समझा नहीं जा सका। ग्राहक बिना संशोधनों के अनुरोध को नहीं दोहराएगा
अनधिकृत 401
अनुरोध को उपयोगकर्ता प्रमाणीकरण की आवश्यकता है। प्रतिक्रिया में डब्ल्यूडब्ल्यूडब्ल्यू-ऑथेंटिकेट हेडर फ़ील्ड शामिल होना चाहिए
404 नहीं मिला
सर्वर को अनुरोध-यूआरआई से मेल खाते हुए कुछ भी नहीं मिला है। कोई संकेत नहीं दिया जाता है कि क्या स्थिति अस्थायी या स्थायी है
204 No Content
तब वापस आ सकता है जब इसे कोई परिणाम नहीं मिलता है। नहीं 404
, इसका आपके लिए परिणाम है, लेकिन इसकी कोई सामग्री नहीं है ..
संक्षेप या सरल बनाने के लिए,
2xx: वैकल्पिक डेटा: अच्छी तरह से गठित URI: मानदंड URI का हिस्सा नहीं है: यदि मापदंड वैकल्पिक है जो @RequestBody में निर्दिष्ट किया जा सकता है और @RequestParam को 2xx तक ले जाना चाहिए। उदाहरण: नाम / स्थिति के अनुसार फ़िल्टर करें
4xx: अपेक्षित डेटा: अच्छी तरह से गठित URI नहीं: मानदंड URI का हिस्सा है: यदि मानदंड अनिवार्य है जो केवल @PathVariable में निर्दिष्ट किया जा सकता है तो इसे 4xx तक ले जाना चाहिए। उदाहरण: अद्वितीय आईडी द्वारा खोज।
इस प्रकार पूछी गई स्थिति के लिए: "उपयोगकर्ता / 9" 4xx होगा (संभवतः 404) लेकिन "उपयोगकर्ताओं के लिए? नाम = सुपरमैन" 2xx (संभवतः 204) होना चाहिए
दो प्रश्न पूछे जाते हैं। एक शीर्षक में और एक उदाहरण में। मुझे लगता है कि इससे आंशिक रूप से विवाद की मात्रा बढ़ गई है जिसके बारे में प्रतिक्रिया उपयुक्त है।
प्रश्न शीर्षक खाली डेटा के बारे में पूछता है। खाली डेटा अभी भी डेटा है, लेकिन डेटा नहीं के समान नहीं है। तो यह एक परिणाम सेट, यानी एक सूची, शायद से अनुरोध करने का सुझाव देता है /users
। यदि कोई सूची खाली है, तो यह अभी भी एक सूची है इसलिए 204 (कोई सामग्री नहीं) सबसे उपयुक्त है। आपने केवल उपयोगकर्ताओं की एक सूची मांगी है और एक के साथ प्रदान की गई है, यह सिर्फ सामग्री नहीं है।
इसके बजाय प्रदान किया गया उदाहरण किसी विशिष्ट वस्तु, उपयोगकर्ता, के बारे में पूछता है /users/9
। यदि उपयोगकर्ता # 9 नहीं मिला है, तो कोई उपयोगकर्ता ऑब्जेक्ट वापस नहीं किया गया है। आपने एक विशिष्ट संसाधन (एक उपयोगकर्ता ऑब्जेक्ट) के लिए कहा और इसे नहीं दिया गया क्योंकि यह नहीं मिला, इसलिए 404 उपयुक्त है।
मुझे लगता है कि इस तरह से काम करने का तरीका यह है कि यदि आप बिना किसी सशर्त विवरण को शामिल किए बिना जिस तरह की अपेक्षा करते हैं, उसमें प्रतिक्रिया का उपयोग कर सकते हैं, तो 204 का उपयोग करें अन्यथा 404 का उपयोग करें।
मेरे उदाहरण में मैं यह देखने के लिए जाँच किए बिना एक खाली सूची पर पुनरावृत्ति कर सकता हूं कि उसमें सामग्री है या नहीं, लेकिन मैं किसी ऑब्जेक्ट को किसी ऑब्जेक्ट को बिना तोड़-फोड़ किए या चेक को जोड़कर देख सकता हूं कि यह शून्य है या नहीं।
यदि आप अपनी आवश्यकताओं के अनुरूप हैं, तो आप निश्चित रूप से अशक्त वस्तु पैटर्न का उपयोग करके किसी वस्तु को वापस कर सकते हैं, लेकिन यह एक और सूत्र के लिए एक चर्चा है।
प्रश्न में देखने के बाद, आपको इसका उपयोग 404
क्यों नहीं करना चाहिए ?
RFC 7231 के आधार पर सही स्थिति कोड है204
ऊपर के खिलाड़ियों में मैंने 1 छोटी सी गलतफहमी को देखा:
1.- संसाधन है: /users
2.- /users/8
संसाधन नहीं है, यह है: /users
मार्ग पैरामीटर वाला संसाधन8
, उपभोक्ता शायद इसे नोटिस नहीं कर सकता है और अंतर को नहीं जानता है, लेकिन प्रकाशक को यह जानना चाहिए और यह जानना चाहिए! ... इसलिए उसे उपभोक्ताओं के लिए एक सटीक प्रतिक्रिया वापस करनी चाहिए। अवधि।
इसलिए:
RFC के आधार पर: 404 गलत है क्योंकि संसाधन /users
पाए जाते हैं, लेकिन पैरामीटर का उपयोग करके निष्पादित तर्क को प्रतिक्रिया के रूप में वापस जाने के लिए 8
कोई भी नहीं मिला content
, इसलिए सही उत्तर है:204
यहां मुख्य बिंदु यह है: 404
आंतरिक तर्क को संसाधित करने के लिए संसाधन भी नहीं मिला
204
a: मुझे संसाधन मिला है, तर्क निष्पादित किया गया था, लेकिन मुझे रूट पैरामीटर में दिए गए आपके मानदंडों का उपयोग करते हुए कोई डेटा नहीं मिला, इसलिए मैं आपके लिए कुछ भी वापस नहीं कर सकता। क्षमा करें, अपने मापदंड सत्यापित करें और मुझे फिर से कॉल करें।
200
• ठीक है मैंने संसाधन पाया, तर्क निष्पादित किया गया था (यहां तक कि जब इम कुछ भी वापस करने के लिए मजबूर नहीं किया जाता है) इसे ले लो और अपनी इच्छा पर इसका उपयोग करें।
205
: (एक जीईटी प्रतिक्रिया का सबसे अच्छा विकल्प) मुझे संसाधन मिला, तर्क निष्पादित किया गया, मेरे पास आपके लिए कुछ सामग्री है, इसका अच्छी तरह से उपयोग करें, ओह, वैसे यदि आप इसे एक दृश्य में साझा करने जा रहे हैं, तो कृपया इस दृश्य को ताज़ा करें इसे प्रदर्शित करें।
आशा है ये मदद करेगा।
जो मौजूदा उत्तर विस्तृत नहीं है, वह यह है कि इससे कोई फर्क पड़ता है कि आप पथ पैरामीटर या क्वेरी पैरामीटर का उपयोग करते हैं।
/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 का उपयोग करना पसंद करता हूँ। यहाँ क्यों:
204
एक void
विधि की तरह है । मैं के लिए यह प्रयोग करेंगे नहीं GET
, केवल के लिए POST
, PUT
, और DELETE
। मैं ऐसे मामले में अपवाद बनाता हूं GET
जहां पहचानकर्ता क्वेरी पैरामीटर हैं पथ पैरामीटर नहीं।NoSuchElementException
, ArrayIndexOutOfBoundsException
या ऐसा कुछ है, जो क्लाइंट द्वारा किसी ऐसे आईडी का उपयोग करने के कारण होता है जो मौजूद नहीं है, इसलिए, यह एक क्लाइंट त्रुटि है।204
एक अतिरिक्त शाखा का मतलब है जिसे टाला जा सकता है। यह क्लाइंट कोड को जटिल करता है, और कुछ मामलों में यह सर्वर कोड को भी जटिल करता है (इस पर निर्भर करता है कि आप एंटिटी / मॉडल मोनडेस या एंटिटीज / मॉडल का उपयोग करते हैं? और मैं दृढ़ता से यूनिट / मॉडल मोनड्स से दूर रहने की सलाह देता हूं , क्योंकि यह खराब बग पैदा कर सकता है क्योंकि मोनाद के अनुसार, आपको लगता है कि एक ऑपरेशन सफल है और २०० या २०४ पर वापस लौटें जब आपको वास्तव में कुछ और लौटाना चाहिए)।अंतिम लेकिन कम से कम नहीं: संगति
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
इसके बजाय उपयोग करता है , तो कीड़े के एक पूरे अलग-अलग कैन को खोला जाता है।
ट्विटर "कोई डेटा नहीं मिला" जैसे कस्टम त्रुटि संदेश के साथ 404 का उपयोग करता है।
Ref: https://developer.twitter.com/en/docs/basics/response-codes.html
204 अधिक उपयुक्त है। खासकर जब आपके पास यह सुनिश्चित करने के लिए एक अलर्ट सिस्टम हो कि आप वेबसाइट सुरक्षित हैं, तो इस मामले में 404 भ्रम पैदा करेगा क्योंकि आपको नहीं पता कि कुछ 404 अलर्ट बैकएंड त्रुटियां या सामान्य अनुरोध हैं, लेकिन प्रतिक्रिया खाली है।
मैं कहूंगा, न तो वास्तव में उचित है। जैसा कि कहा गया है - जैसे @anneb द्वारा, मुझे भी लगता है कि समस्याओं का हिस्सा एक HTTP प्रतिक्रिया कोड का उपयोग करने से उत्पन्न स्थिति से संबंधित स्थिति का परिवहन करने के लिए होता है। REST सेवा के बारे में कुछ भी कहना है कि इसके स्वयं के प्रसंस्करण के बारे में REST के विशिष्ट कोड के माध्यम से परिवहन किया जाना चाहिए।
मेरा तर्क है कि, यदि HTTP सर्वर को कोई ऐसी सेवा मिलती है, जो भेजे गए अनुरोध का उत्तर देने के लिए तैयार है, तो उसे HTTP 404 के साथ जवाब नहीं देना चाहिए - अंत में, सर्वर द्वारा कुछ पाया गया - जब तक कि स्पष्ट रूप से ऐसा नहीं बताया गया सेवा जो अनुरोध को संसाधित करती है।
चलिए एक पल के लिए निम्न URL मान लेते हैं http://example.com/service/return/test
:।
404
तो सही है। यह सच है, अगर यह फ़ाइल को वितरित करने के लिए किसी प्रकार की सेवा पूछता है और यह सेवा यह बताती है कि उस नाम का कुछ भी मौजूद नहीं है।सेवा से किसी भी प्रतिक्रिया के बिना स्पष्ट रूप से एक अलग व्यवहार की आवश्यकता होती है, HTTP सर्वर केवल 3 चीजें कह सकता है:
503
यदि अनुरोध को संभालने वाली सेवा नहीं चल रही है या प्रतिक्रिया नहीं दे रही है;200
अन्यथा HTTP सर्वर वास्तव में अनुरोध को पूरा कर सकता है - कोई फर्क नहीं पड़ता कि सेवा बाद में क्या कहेगी;400
या 404
यह इंगित करने के लिए कि ऐसी कोई सेवा नहीं है (जैसा कि "मौजूद लेकिन ऑफ़लाइन" के विपरीत) और कुछ नहीं मिला।प्रश्न पर वापस जाने के लिए: मुझे लगता है कि सबसे साफ तरीका यह होगा कि पहले से बताए गए स्थान के अलावा किसी अन्य पर किसी भी प्रतिक्रिया कोड का उपयोग न करें। यदि सेवा मौजूद है और प्रतिक्रिया दे रही है, तो एचटीटीपी कोड 200 होना चाहिए। प्रतिक्रिया में वह स्थिति होनी चाहिए जिसमें सेवा अलग हेडर में वापस आए - यहाँ, सेवा कह सकती है
REST:EMPTY
जैसे अगर यह sth के लिए खोज करने के लिए कहा गया था। और वह शोध खाली लौटा;REST:NOT FOUND
अगर यह विशेष रूप से sth के लिए कहा गया था। "आईडी-लाइक" - कि एक फ़ाइल का नाम या आईडी या प्रविष्टि नंबर 24, आदि द्वारा एक संसाधन - और वह विशिष्ट संसाधन नहीं मिला (आमतौर पर, एक विशिष्ट संसाधन का अनुरोध किया गया था और नहीं मिला);REST:INVALID
यदि अनुरोध के किसी भी भाग को भेजा गया था तो सेवा द्वारा मान्यता प्राप्त नहीं है।(ध्यान दें कि मैंने इन्हें "REST:" के साथ उपसर्ग किया था, इस तथ्य को चिह्नित करने के लिए कि इनमें HTTP मान कोड के समान मान या शब्द हो सकते हैं, वे sth हैं। पूरी तरह से अलग हैं)
आइए ऊपर दिए गए 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
में इसके लिए योजना बनाई है ।दो अलग-अलग चीजों को मिलाने की तुलना में यह अंतर बहुत साफ है। यह डिबगिंग को आसान बना देगा और प्रसंस्करण को थोड़ा और अधिक जटिल बना देगा, यदि बिल्कुल भी।
समस्या और चर्चा इस तथ्य से उत्पन्न होती है कि HTTP प्रतिक्रिया कोड का उपयोग उस सेवा की स्थिति को बताने के लिए किया जा रहा है जिसके परिणाम HTTP द्वारा दिए गए हैं, या sth को निरूपित करने के लिए। यह स्वयं HTTP सर्वर के दायरे में नहीं है। इस विसंगति के कारण, इस सवाल का जवाब नहीं दिया जा सकता है और सभी राय बहुत चर्चा के अधीन हैं।
एक सेवा द्वारा संसाधित अनुरोध का राज्य और HTTP सर्वर प्रतिक्रिया नहीं (RFC 6919) HTTP प्रतिक्रिया कोड द्वारा नहीं दी जानी चाहिए। HTTP कोड SHOULD (RFC 2119) में केवल वह जानकारी होती है जो HTTP सर्वर अपने स्वयं के दायरे से दे सकता है: अर्थात्, सेवा अनुरोध को संसाधित करने के लिए मिली थी या नहीं।
इसके बजाय, एक उपभोक्ता को सेवा के लिए अनुरोध की स्थिति के बारे में बताने के लिए एक अलग तरीके का उपयोग किया जाना चाहिए जो वास्तव में अनुरोध को संसाधित कर रहा है। मेरा प्रस्ताव एक विशिष्ट हेडर के माध्यम से ऐसा करने का है। आदर्श रूप से, हेडर का नाम और इसकी सामग्री दोनों एक मानक का पालन करते हैं जो उपभोक्ताओं के लिए थिसस प्रतिक्रियाओं के साथ काम करना आसान बनाता है।
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 स्थिति कोड का उपयोग नहीं किया जाना चाहिए। (उदाहरण: विशिष्ट परिणाम के बिना कोई सूची वाली सूची)
ऐसी बातें व्यक्तिपरक हो सकती हैं और दोनों पक्षों में कुछ दिलचस्प और विभिन्न ठोस तर्क हैं। हालांकि [मेरी राय में] लापता डेटा के लिए 404 लौटाना सही नहीं है । यहाँ स्पष्ट करने के लिए एक सरलीकृत विवरण दिया गया है:
कुछ भी नहीं टूटा, समापन बिंदु पाया गया था, और तालिका और कॉलम पाए गए थे ताकि डीबी को चौकन्ना कर दिया गया और डेटा "सफलतापूर्वक" वापस आ गया!
अब - चाहे उस "सफल प्रतिक्रिया" में डेटा है या नहीं, इससे कोई फर्क नहीं पड़ता, आपने "संभावित" डेटा की प्रतिक्रिया मांगी और उस "संभावित" डेटा के साथ प्रतिक्रिया पूरी हुई। रिक्त, रिक्त आदि मान्य डेटा है।
200 का मतलब है कि हमने जो भी अनुरोध किया वह सफल रहा। मैं डेटा का अनुरोध कर रहा हूं, HTTP / REST के साथ कुछ भी गलत नहीं हुआ, और जैसा कि डेटा (यद्यपि खाली) मेरे "डेटा के लिए अनुरोध" को वापस कर दिया गया था।
एक 200 लौटें और प्रत्येक विशिष्ट परिदृश्य वारंट के रूप में रिक्वेस्टर को खाली डेटा के साथ सौदा करने दें!
इस उदाहरण पर विचार करें:
खाली किया जा रहा यह डेटा पूरी तरह से वैध है। इसका मतलब है कि उपयोगकर्ता के पास कोई उल्लंघन नहीं है। यह एक 200 है क्योंकि यह सब वैध है, तब मैं कर सकता हूं:
आपके पास कोई उल्लंघन नहीं है, एक ब्लूबेरी मफिन है!
यदि आप इसे 404 समझ रहे हैं तो आप क्या कह रहे हैं? उपयोगकर्ता के उल्लंघन नहीं मिले? अब, व्याकरणिक रूप से यह सही है, लेकिन यह केवल सही नहीं है REST दुनिया में सफलता या विफलता अनुरोध के बारे में थी। इस उपयोगकर्ता के लिए "इंफ्रैक्शन" डेटा सफलतापूर्वक पाया जा सकता है, शून्य उल्लंघन हैं - एक वास्तविक संख्या जो एक वैध स्थिति का प्रतिनिधित्व करती है।
[गाल नोट ..]
अपने शीर्षक में, आप अवचेतन रूप से सहमत हैं कि 200 सही प्रतिक्रिया है:
एक वैध अनुरोध लेकिन एक खाली डेटा के लिए उचित REST प्रतिक्रिया कोड क्या है ?
यहां कुछ बातों पर विचार करना है कि कौन सी स्थिति कोड का उपयोग करना है, भले ही विषय और ट्रिकी विकल्पों की परवाह किए बिना:
एक सामान्य एनम के साथ प्रतिक्रिया सामग्री को एनकोड करें जो क्लाइंट को उस पर स्विच करने की अनुमति देता है और तदनुसार तर्क को कांटा करता है। मुझे यकीन नहीं है कि आपका ग्राहक "डेटा नहीं मिला" 404 और "वेब संसाधन नहीं मिला" 404 के बीच अंतर को कैसे परिभाषित करेगा? आप नहीं चाहते कि कोई व्यक्ति Z / 9 में ब्राउज़ करे और ग्राहक को आश्चर्य हो जैसे कि अनुरोध मान्य था लेकिन कोई डेटा वापस नहीं आया।
410 का उपयोग क्यों नहीं? यह सुझाव देता है कि अनुरोधित संसाधन अब मौजूद नहीं है और ग्राहक से अपेक्षा की जाती है कि वह आपके मामले में उस संसाधन के लिए कभी अनुरोध न करेusers/9
।
आप 410 के बारे में अधिक जानकारी यहाँ से प्राप्त कर सकते हैं: https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
यह बहुत दुखद है कि इस धागे में कुछ सरल और अच्छी तरह से परिभाषित "राय आधारित" बन गया।
एक HTTP सर्वर केवल "संस्थाओं" के बारे में जानता है, जो किसी भी सामग्री के लिए एक अमूर्तता है, यह एक स्थिर वेब पेज, खोज परिणामों की एक सूची, अन्य संस्थाओं की सूची, किसी चीज़ का एक विवरण, एक मीडिया फ़ाइल, आदि।
इस तरह की प्रत्येक इकाई को एक अद्वितीय URL द्वारा पहचानने योग्य होने की उम्मीद है, जैसे
यदि कोई सर्वर दिए गए URL द्वारा संसाधन पाता है, तो इससे कोई फर्क नहीं पड़ता कि उसकी सामग्री क्या है - 2G of data, null, {}, [] - जब तक यह मौजूद है, यह 200 होगा। लेकिन अगर ऐसी इकाई है सर्वर के लिए ज्ञात नहीं है, यह 404 "नॉट फाउंड" को वापस करने के लिए उपलब्ध है।
एक भ्रम डेवलपर्स से लगता है जो सोचते हैं कि यदि आवेदन में एक निश्चित पथ आकार के लिए हैंडलर है, तो यह एक त्रुटि नहीं होनी चाहिए। HTTP प्रोटोकॉल की नजर में यह मायने नहीं रखता है कि सर्वर के इनरल्स में क्या हुआ है (यानी क्या डिफॉल्ट राउटर ने रिस्पॉन्स किया या किसी विशिष्ट पथ शेप के लिए हैंडलर), जब तक कि सर्वर पर मैचिंग एंटिटी न हो। अनुरोधित URL (जो अनुरोधित एमपी 3 फ़ाइल, वेबपेज, उपयोगकर्ता ऑब्जेक्ट आदि), जो वैध सामग्री (खाली या अन्यथा) वापस करेगा, यह 404 (या 410 आदि) होना चाहिए।
भ्रम का एक और बिंदु "कोई डेटा नहीं" और "कोई इकाई" नहीं है। पूर्व एक इकाई की सामग्री के बारे में है, और बाद में इसके अस्तित्व के बारे में है।
उदाहरण 1:
उदाहरण 2:
उदाहरण 3:
404 किसी भी क्लाइंट के लिए बहुत भ्रामक होगा यदि आप सिर्फ इसलिए लौटते हैं क्योंकि प्रतिक्रिया में कोई डेटा नहीं है।
मेरे लिए, खाली शरीर के साथ रिस्पांस कोड 200 यह समझने के लिए पर्याप्त है कि सब कुछ सही है लेकिन आवश्यकताओं से मेल खाने वाला कोई डेटा नहीं है।
Microsoft के अनुसार: ASP.NET कोर वेब एपीआई में कंट्रोलर एक्शन रिटर्न प्रकार , लगभग नीचे तक स्क्रॉल करें, आपको डेटाबेस में नहीं मिली वस्तु से संबंधित 404 के बारे में निम्नलिखित ब्लर्ब मिलते हैं। यहां वे सुझाव देते हैं कि एक 404 खाली डेटा के लिए उपयुक्त है।
जैसा कि कई ने कहा है, 404 भ्रामक है और यह ग्राहक को भेदभाव करने की अनुमति नहीं देता है यदि अनुरोध यूरी मौजूद नहीं है, या यदि अनुरोधित यूआरआई अनुरोधित संसाधन नहीं ला सकता है।
200 की स्थिति में संसाधन डेटा शामिल होने की उम्मीद है - इसलिए यह सही विकल्प नहीं है। 204 स्थिति का अर्थ पूरी तरह से कुछ और है और इसे GET अनुरोधों के लिए प्रतिक्रिया के रूप में उपयोग नहीं किया जाना चाहिए।
अन्य सभी मौजूदा स्थिति लागू नहीं हैं, एक कारण या दूसरे के लिए।
मैंने कई स्थानों पर इस विषय पर चर्चा की है। मेरे लिए, यह स्पष्ट रूप से स्पष्ट है कि विषय के चारों ओर भ्रम को खत्म करने के लिए, एक समर्पित सफलता की स्थिति की आवश्यकता है। कुछ ऐसा " 209 - प्रदर्शन के लिए कोई संसाधन नहीं ।
यह 2xx का स्टेटस होगा क्योंकि आईडी नहीं ढूंढने को क्लाइंट एरर नहीं माना जाना चाहिए (अगर क्लाइंट को सब कुछ पता होता है जो सर्वर के डीबी में है, तो उन्हें सर्वर से कुछ भी पूछने की जरूरत नहीं होगी, ना ही?)। यह समर्पित स्थिति अन्य स्थितियों का उपयोग करके बहस किए गए सभी मुद्दों को संबोधित करेगी।
एकमात्र सवाल यह है: मैं इसे मानक के रूप में स्वीकार करने के लिए आरएफसी कैसे प्राप्त करूं?