400 BAD HTTP त्रुटि कोड अर्थ का अनुरोध?


346

मेरे पास एक JSON अनुरोध है जो मैं एक HTTP URL पर पोस्ट कर रहा हूं।

क्या यह माना जाना चाहिए 400कि requestedResourceफ़ील्ड कहाँ मौजूद है लेकिन "Roman"क्या इस फ़ील्ड के लिए कोई अमान्य मान है?

[{requestedResource:"Roman"}] 

क्या इसे 400ऐसे "blah"क्षेत्र के रूप में माना जाना चाहिए जहां क्षेत्र बिल्कुल मौजूद नहीं है?

[{blah:"Roman"}]

34
शायद 402 , यदि वे वास्तव में मूल्य भेजने में सक्षम होना चाहते हैं, तो उन्हें Romanबस आपको अधिक भुगतान करने की आवश्यकता है :)
जेसन स्पर्सके

एक वास्तविक परिदृश्य जहां मैंने इसे देखा - मैंने कुछ डेटा जोड़ने के लिए एक PUT कॉल किया। मैंने एक ही अनुरोध निकाय का उपयोग करके फिर से कॉल किया और एक 400 प्राप्त किया, जिसने मुझे बताया कि पिछले अनुरोध को पहले से ही संसाधित किया जा रहा है। हमारे सिस्टम के लिए उस डेटा को जोड़ने के लिए कुछ समय लगना सामान्य है।
मास्टरजियो 2

जवाबों:


361

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

JSON पेलोड के साथ REST एपीआई के मामले में, 400 आम तौर पर होते हैं, और सही ढंग से मैं कहूंगा, यह इंगित करने के लिए उपयोग किया जाता है कि सेवा के लिए एपीआई विनिर्देश के अनुसार JSON किसी तरह से अमान्य है।

उस तर्क से, आपके द्वारा प्रदत्त दोनों परिदृश्य 400 के होने चाहिए।

इसके बजाय कल्पना करें कि यह JSON के बजाय XML था। दोनों मामलों में, XML स्कीमा सत्यापन को कभी भी पारित नहीं करेगा - या तो अपरिभाषित तत्व या अनुचित तत्व मूल्य के कारण। यह एक बुरा अनुरोध होगा। वही सौदा यहाँ।


3
मैं आपसे सहमत हूं "उस तर्क से, आपके द्वारा प्रदान किए गए दोनों परिदृश्य 400 के होने चाहिए।" मुझे नहीं लगता कि JSON की सामग्री यहां मायने रखती है। जब आप यह कहते हैं कि मैं आपको विश्वास दिलाता हूं कि आपके द्वारा भेजे जाने वाले डेटा के प्रारूप में मुद्दों को संबोधित करता है, उदाहरण के लिए यदि आप JSON में किसी क्षेत्र को छोड़ते हैं तो आपको 400 मिलना चाहिए।
गीथांग

2
Restapitutorial.com/httpstatuscodes.html पर REST प्रतिक्रिया कोड का एक सभ्य सेट है । यह इस बात पर भी निर्भर करता है कि आप 406 (स्वीकार्य नहीं) या 405 विधि जैसे वैध अनुरोध को कैसे संभालना चाहते हैं। हालांकि, 400 उपयुक्त है क्योंकि "अनुरोध सर्वर द्वारा विकृत सिंटैक्स के कारण समझा नहीं जा सकता है। ग्राहक बिना संशोधनों के अनुरोध को दोहरा सकता है।"
एंड्रयू स्कॉट इवान

3
इसलिए "अनुरोध को विकृत सिंटैक्स के कारण सर्वर द्वारा समझा नहीं जा सकता है" या तो अनुरोध हो सकता है (उदाहरण के लिए, HTTP हेडर में से एक विकृत हो रहा है) या अनुरोध द्वारा किए गए डेटा (उदाहरण के लिए, एक JSON मान गायब है) ?
एम सी सम्राट

2
विद्या कहती हैं, "एक्सएमएल स्कीमा सत्यापन को कभी पास नहीं करेगा"। इंगित किया जा रहा है कि XML पार्सर अच्छी तरह से निर्मित होने के कारण (यानी वाक्यविन्यास ध्वनि) और मान्य (यानी शब्दार्थ ध्वनि, उदाहरण के लिए एक स्कीमा के अनुसार) के बीच अंतर करता है। 400 कोड का वर्णन है "अनुरोध को विकृत सिंटैक्स के कारण सर्वर द्वारा समझा नहीं जा सकता है " - इसलिए इसे सत्यापन त्रुटियों के लिए उपयोग नहीं किया जाना चाहिए।
मार्टिन ली

@Vidya stackoverflow.com/questions/42851301/… इस त्रुटि पर एक नज़र डालें मैं भी इस त्रुटि के समान समस्या का सामना कर रहा हूं यदि आप जानते हैं तो कृपया मेरी मदद करें
मोहन गोपी

74

से w3.org

10.4.1 400 खराब अनुरोध

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


10
एक त्रुटि 400 वापस करने की शुद्धता एक क्षेत्र बनाम एक मूल्य पर नहीं बल्कि समग्र रूप से अनुरोध पर आधारित है। मुझे लगता है कि HTTP 400 जाने का एक अच्छा तरीका है
जेसन स्पर्सके 23

क्या आपका मतलब यह है कि 400 प्रतिक्रिया का उपयोग ग्राहकों को यह बताने के लिए किया जाना चाहिए कि अनुरोध में, यूआरएल, हेडर, बॉडी आदि कुछ भी गलत हो सकता है और केवल शरीर नहीं?
मास्टरजियो 2

3
अच्छी तरह से url के लिए सही कोड 404 है, हेडर के लिए, मुझे लगता है कि यह टॉस अप है, 403 (निषिद्ध) ऐसा लगता है कि हेडर पहचान को अस्वीकार कर रहा है, लेकिन अगर हेडर आउटपुट स्वरूप का निर्धारण कर रहे हैं तो क्या होगा? मुझे लगता है कि एकमात्र रास्ता 400 के लिए सही है उस स्थिति के बारे में जहां एक कार्रवाई का अनुरोध किया जा रहा है जिसका कोई मतलब नहीं है और इसे दोहराया नहीं जाना चाहिए। मैंने 4 साल पहले यह उत्तर लिखा था, इन दिनों मुझे लगता है कि त्रुटियों को भी 200 वापस आना चाहिए, और यह कि त्रुटियाँ केवल http ट्रांसमिशन पर लागू होनी चाहिए, न कि पेलोड पर।
जेसन स्पर्सके

1
यह जवाब है, इस का एक बहुत शामिल किया गया है, हालांकि मैं अभी तक चार्ट के सभी के माध्यम से नहीं पढ़ा है stackoverflow.com/a/34324179/16959
जेसन Sperske

@JasonSperske लोड बैलेंसर्स, प्रॉक्सिस और अन्य मिडलवेयर अक्सर रूट, रिपोर्ट और मरम्मत में मदद करने के लिए स्थिति कोड का उपयोग करते हैं। सौभाग्य से "422" जैसे कोड स्पष्ट रूप से पेलोड के बारे में हैं, इसलिए पेलोड स्थिति कोड के लिए कल्पना में कुछ जगह है।
एरिक एरोनिटी

53

एक HTTP प्रतिक्रिया कोड का चयन करना काफी आसान काम है और इसे सरल नियमों द्वारा वर्णित किया जा सकता है। केवल मुश्किल हिस्सा जिसे अक्सर भुला दिया जाता है वह RFC 7231 से पैरा 6.5 है:

HEAD अनुरोध का जवाब देने के अलावा, सर्वर SHOULD त्रुटि स्थिति की व्याख्या वाला एक प्रतिनिधित्व भेजता है, और यह एक अस्थायी या स्थायी स्थिति है या नहीं।

नियम इस प्रकार हैं:

  1. यदि अनुरोध सफल रहा, तो 2xx कोड (पुनर्निर्देशित के लिए 3xx) वापस करें। यदि सर्वर पर कोई आंतरिक तर्क त्रुटि थी, तो 5xx लौटाएं। यदि क्लाइंट अनुरोध में कुछ भी गलत है, तो 4xx कोड वापस करें।
  2. चयनित श्रेणी से उपलब्ध प्रतिक्रिया कोड देखें। यदि उनमें से एक का नाम है जो आपकी स्थिति से अच्छी तरह मेल खाता है, तो आप इसका उपयोग कर सकते हैं। अन्यथा केवल x00 कोड (200, 400, 500) पर वापस आ जाओ। यदि आपको संदेह है, तो x00 कोड पर वापस जाएं।
  3. प्रतिक्रिया निकाय में त्रुटि विवरण लौटाएं। 4xx कोड के लिए इसमें क्लाइंट डेवलपर के लिए कारण को समझने और क्लाइंट को ठीक करने के लिए पर्याप्त जानकारी होनी चाहिए। 5xx के लिए सुरक्षा कारणों की वजह से कोई विवरण सामने नहीं आना चाहिए।
  4. यदि क्लाइंट को अलग-अलग त्रुटियों को अलग करने की आवश्यकता है और इसके आधार पर अलग-अलग प्रतिक्रिया है, तो एक मशीन पठनीय और विस्तार योग्य त्रुटि प्रारूप को परिभाषित करें और इसे अपने एपीआई में हर जगह उपयोग करें। यह शुरुआत से ही अच्छा अभ्यास है।
  5. ध्यान रखें कि क्लाइंट डेवलपर अजीब चीजें कर सकता है और स्ट्रिंग को पार्स करने की कोशिश करता है जिसे आप मानव पठनीय विवरण के रूप में वापस करते हैं। और स्ट्रिंग्स को बदलकर आप ऐसे बुरी तरह से लिखे गए क्लाइंट्स को तोड़ देंगे। इसलिए हमेशा मशीन पठनीय विवरण प्रदान करें और पाठ में अतिरिक्त जानकारी की रिपोर्टिंग से बचने का प्रयास करें।

तो आपके मामले में मैं 400 त्रुटि और कुछ इस तरह से वापस आऊंगा अगर "रोमन" उपयोगकर्ता इनपुट से प्राप्त होता है और ग्राहक को विशिष्ट प्रतिक्रिया होनी चाहिए:

{
    "error_type" : "unsupported_resource",
    "error_description" : "\"Roman\" is not supported"
}

या अधिक सामान्य त्रुटि, यदि ऐसी स्थिति क्लाइंट में एक खराब तर्क त्रुटि है और अपेक्षित नहीं है, जब तक कि डेवलपर ने कुछ गलत न किया हो:

{
    "error_type" : "malformed_json",
    "error_description" : "\"Roman\" is not supported for \"requestedResource\" field"
}

21

न तो मामले में "वाक्य रचना विकृत" है। यह शब्दार्थ है कि गलत हैं। इसलिए, IMHO एक 400 अनुचित है। इसके बजाय, किसी तरह की त्रुटि वस्तु जैसे { "error": { "message": "Unknown request keyword" } }या जो भी हो, के साथ 200 वापस करना उचित होगा ।

ग्राहक प्रसंस्करण पथ पर विचार करें। वाक्यविन्यास में त्रुटि (जैसे अमान्य JSON) कार्यक्रम के तर्क में एक त्रुटि है, दूसरे शब्दों में किसी प्रकार का एक बग है, और तदनुसार 403 के समान एक तरह से संभाला जाना चाहिए; दूसरे शब्दों में, कुछ बुरा गलत हो गया है।

दूसरी ओर, पैरामीटर मान में एक त्रुटि, शब्दार्थ की एक त्रुटि है, शायद खराब उपयोगकर्ता मान्य इनपुट कहने के कारण। यह एक HTTP त्रुटि नहीं है (हालांकि मुझे लगता है कि यह एक 422 हो सकता है)। प्रसंस्करण पथ अलग होगा।

उदाहरण के लिए, jQuery में, मैं एक एकल त्रुटि हैंडलर लिखना पसंद नहीं करूंगा जो 500 और कुछ ऐप-विशिष्ट अर्थ संबंधी त्रुटि दोनों चीजों से संबंधित है। अन्य चौखटे, एक के लिए एम्बर, HTTP त्रुटियों को भी 400s और 500s की पहचान बड़ी मोटी विफलताओं के रूप में मानते हैं, प्रोग्रामर को यह पता लगाने की आवश्यकता होती है कि यह "वास्तविक" त्रुटि है या नहीं इसके आधार पर शाखा क्या है।


4
+1, HTTP में P प्रोटोकॉल के लिए है और यदि प्रतिक्रिया HTTP त्रुटि है, तो यह एक निम्न-स्तरीय समस्या होनी चाहिए। मैंने torazaburo द्वारा बताए गए दृष्टिकोण का उपयोग करके वर्षों में बहुत सी कोड जटिलता से बचा है। REST भूमि में कम दर्द होगा यदि हम सभी HTTP त्रुटियों के साथ बार-बार उड़ने के बजाय लचीला कोड लिखते हैं।
डेम पिलाफियन

25
200 का मतलब है कि अनुरोध संसाधित हो गया है, इसलिए एक ग्राहक पर एक सामान्य सफलता तर्क निष्पादित किया जाना चाहिए। यहां हमारे पास निश्चित रूप से एक त्रुटि है, इसलिए प्रतिक्रिया में 2xx या 3xx कोड नहीं हो सकता है। यह 5xx नहीं हो सकता है क्योंकि यह एक सर्वर साइड त्रुटि है और हमारे पास क्लाइंट साइड में त्रुटि है। तो यह एक 4xx त्रुटि होना चाहिए। लेकिन प्रतिक्रिया निकाय में त्रुटि विवरण एक सही काम है और वास्तव में HTTP विनिर्देश द्वारा सलाह देने का एक तरीका है।
एलेक्सी गुसेनोव

422 बेहतर है, लॉगर, परदे के पीछे और अन्य साधनों के लिए
एरिक एरोनिटी

16

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

यदि अनुरोध पेलोड में एक बाइट-अनुक्रम होता है जिसे पार्स नहीं किया जा सकता है application/json(यदि सर्वर को उम्मीद है कि डेटाफॉर्मैट), तो उपयुक्त स्थिति कोड है 415:

सर्वर अनुरोध को सेवा देने से इनकार कर रहा है क्योंकि अनुरोध की इकाई अनुरोधित विधि के लिए अनुरोधित संसाधन द्वारा समर्थित प्रारूप में नहीं है।

यदि अनुरोध पेलोड वाक़ई सही है लेकिन शब्दार्थ रूप से गलत है, तो गैर-मानक 422प्रतिक्रिया कोड का उपयोग किया जा सकता है, या मानक 403स्थिति कोड:

सर्वर अनुरोध को समझ गया, लेकिन इसे पूरा करने से इनकार कर रहा है। प्राधिकरण मदद नहीं करेगा और अनुरोध को दोहराया नहीं जाना चाहिए।


3
नहीं, 415 जब इकाई गलत प्रकार जैसे की होने का दावा किया जाता है के लिए है image/gifबजाय text/json में Content-Type:हैडर। - संभवतः यह भी लागू होता है यदि किसी मल्टीपार्ट के घटक में गलत प्रकार निर्दिष्ट किया गया है, तो टूल्स देखें ।ietf.org/html/rfc4918 जहां यह अधिक चर्चा के लिए 422 पर चर्चा करता है,
जैसन

8

उम्मीदों के बारे में सोचो।

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


5

एक पूरक के रूप में, जो लोग मेरी जैसी ही समस्या को पूरा कर सकते हैं, मैं $.ajaxडेटा को सर्वर पर पोस्ट करने के लिए उपयोग कर रहा हूं और मुझे 400पहली बार में त्रुटि भी मिली ।

मान लें कि मेरे पास एक जावास्क्रिप्ट चर है,

var formData = {
    "name":"Gearon",
    "hobby":"Be different"
    }; 

नीचे दिए गए formDataकुंजी के मूल्य के रूप में सीधे चर का उपयोग न करें data:

$.ajax({
    type: "post",
    dataType: "json",
    url: "http://localhost/user/add",
    contentType: "application/json",
    data: formData,
    success: function(data, textStatus){
        alert("Data: " + data + "\nStatus: " + status); 
    }
});

इसके बजाय, JSON.stringify का उपयोग formDataनीचे दिए गए विवरणों को संलग्न करने के लिए करें:

$.ajax({
    type: "post",
    dataType: "json",
    url: "http://localhost/user/add",
    contentType: "application/json",
    data: JSON.stringify(formData),
    success: function(data, textStatus){
        alert("Data: " + data + "\nStatus: " + status); 
    }
});

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


4

पहले URL की जाँच करें यह गलत हो सकता है, यदि यह सही है तो अनुरोध निकाय की जाँच करें जिसे आप भेज रहे हैं, संभावित कारण यह है कि आप भेज रहे हैं सही वाक्यविन्यास याद कर रहे हैं।

विस्तृत करने के लिए, अनुरोध स्ट्रिंग में विशेष वर्णों की जांच करें। यदि यह (विशेष चार) प्रयोग किया जा रहा है तो यह इस त्रुटि का मूल कारण है।

अनुरोध की प्रतिलिपि बनाने का प्रयास करें और प्रत्येक टैग डेटा का विश्लेषण करें।


मुझे http 400 त्रुटि मिल रही थी, मैंने जांच की कि मेरे अनुरोध में कुछ विशेष वर्ण हैं। इसे ठीक करने के लिए, मैंने सामग्री प्रकार में charset = UTF-8 पास किया।
किस्लाय किशोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.