यदि कोई पैरामीटर वाक्यविन्यास रूप से सही है, लेकिन क्या मुझे HTTP 400 (खराब अनुरोध) का दर्जा वापस करना चाहिए, लेकिन व्यवसाय नियम का उल्लंघन करता है?


56

कहें कि मेरे पास एक REST समापन बिंदु है जो एक पैरामीटर के रूप में पूर्णांक लेता है:

/makeWaffles?numberOfWaffles=3

इस मामले में, मैं चाहता हूं कि संख्या सकारात्मक हो क्योंकि मैं वफ़ल की नकारात्मक संख्या नहीं बना सकता (और 0 वफ़ल का अनुरोध समय की बर्बादी है)। इसलिए मैं किसी भी अनुरोध को अस्वीकार करना चाहता हूं जिसमें सकारात्मक पूर्णांक नहीं है। मैं एक अनुरोध को अस्वीकार करना चाहता हूं जो कुछ अधिकतम पूर्णांक से अधिक है (चलो अब के लिए कहते हैं कि यह MAX_INTEGER है)।

इस घटना में कि कोई व्यक्ति वफ़ल की गैर-सकारात्मक संख्या का अनुरोध करता है, क्या मुझे HTTP 400 (खराब अनुरोध) का दर्जा वापस करना चाहिए? मेरा प्रारंभिक विचार हां है: यह मेरे लिए अनुरोध को पूरा करने के लिए एक वैध संख्या नहीं है। हालांकि, RFC इसे फेंकने के लिए व्यावसायिक नियमों का उल्लेख नहीं करता है:

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

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

तो क्या मुझे एक HTTP 400 (बैड रिक्वेस्ट) स्टेटस वापस करना चाहिए अगर कोई पैरामीटर वाक्य-रचना सही है, लेकिन एक व्यावसायिक नियम का उल्लंघन करता है? या फिर लौटने के लिए अधिक उपयुक्त स्थिति है?



जवाबों:


38

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

RFC 2616 (जून 1999)

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

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

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

RFC 4918 (जून 2007)

11.2। 422 असंसाधित इकाई

422 (Unprocessable Entity) स्थिति कोड का अर्थ है कि सर्वर अनुरोध इकाई की सामग्री प्रकार को समझता है (इसलिए 415 (असमर्थित मीडिया प्रकार) स्थिति कोड अनुचित है), और अनुरोध इकाई का सिंटैक्स सही है (इस प्रकार 400 (खराब अनुरोध) ) स्थिति कोड अनुचित है) लेकिन निहित निर्देशों को संसाधित करने में असमर्थ था। उदाहरण के लिए, यह त्रुटि स्थिति तब हो सकती है यदि किसी XML अनुरोध बॉडी में अच्छी तरह से गठित (यानी, वाक्यविन्यास रूप से सही) हो, लेकिन शब्दार्थ गलत, XML निर्देश।

4xx स्टेटस कोड के मूल विनिर्देश में सिमेंटिक वेलिडेशन के अंतर को भरने के लिए 422 अनप्रोसेबल एंटिटी बनाई गई थी। हालांकि, एक और प्रासंगिक RFC 2014 में आया था , जो सामान्यीकृत 400 से अब सिंटैक्स के लिए विशिष्ट नहीं है

RFC 7231 (जून 2014, स्पष्ट रूप से RFC 2616 का पालन करता है)

6.5.1। 400 गलत अनुरोध

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

ध्यान दें कि 422 विवरण में कहा गया है कि कारण 400 अनुचित है क्योंकि 400 (आरएफसी 2616 के रूप में) केवल खराब अनुरोध सिंटैक्स के लिए लौटाया जाना चाहिए। हालाँकि, RFC 7231 के रूप में, सख्त सिंटैक्स-त्रुटि परिभाषा अब 400 पर लागू नहीं होती है

प्रश्न पर वापस जाएं: जबकि 422 तकनीकी रूप से अधिक विशिष्ट है, इस संदर्भ को देखते हुए, मैं एपीआई मापदंडों के शब्दार्थ सत्यापन के लिए 400 या 422 में से किसी का उपयोग कर सकता था। मैं अपने स्वयं के एपीआई में 422 का उपयोग करने में संकोच कर रहा हूं क्योंकि 422 की परिभाषा तकनीकी रूप से इस बिंदु पर पुरानी है (हालांकि मुझे नहीं पता कि यह आधिकारिक तौर पर कहीं भी मान्यता प्राप्त है)। फ्रैंक के उत्तर में संदर्भित लेख जो 422 के उपयोग को प्रोत्साहित करता है, 2012 में आरएफसी 7231 से दो साल पहले HTTP 400 को स्पष्ट किया गया था। बस एक या दूसरे पर मानकीकरण करना सुनिश्चित करें।


42

मैंने पहला उत्तर पढ़ा और वास्तव में इससे सहमत नहीं था क्योंकि, कम से कम मेरे पढ़ने में, एक खराब अनुरोध (400) का अर्थ है, "मैं आपके अनुरोध को संभाल भी नहीं सकता क्योंकि कुछ मौलिक रूप से गलत है।" और मुझे यह पोस्ट मिला जो 422 को वापस करने के लिए मामला बनाता है।

IETF से

422 असंसाधित इकाई (WebDAV; RFC 4918) अनुरोध अच्छी तरह से बनाया गया था, लेकिन शब्दार्थ त्रुटियों के कारण इसका पालन करने में असमर्थ था।

यह एक अधिक उपयुक्त प्रतिक्रिया की तरह लगता है क्योंकि आपका अनुरोध अच्छी तरह से गठित है, लेकिन आपके सत्यापन नियमों को पारित नहीं करता है।


5
Ive इसे "400 मतलब बुरा वाक्यविन्यास, 422 का अर्थ खराब शब्दार्थ" के रूप में सुना है।
cbojar

33
सभी x00 कोड "सभी पकड़ें" सामान्य कोड हैं। एक 400 अनुचित नहीं है , बस कम विशिष्ट है
जैक

1
अच्छा जवाब है, लेकिन @GoFree द्वारा दिया गया awser मेरे लिए अधिक अर्थ रखता है।
इवर्टन

2
कोड वापस करने के लिए वास्तव में एक मजबूत मामला है जो हर कोई जानता है। बिल्कुल हर किसी को 422 को देखने की आवश्यकता होगी, और मैं शर्त लगाऊंगा कि अभी भी सबसे ज्यादा नहीं पता होगा कि इसे क्या बनाना है।
सिल्वनार

8

हाँ, इनपुट जो समापन बिंदु के निहित अनुबंध का पालन नहीं करता है, "कुछ एक ग्राहक त्रुटि माना जाता है", और 400 वापस आ जाना चाहिए।

इसका अपवाद यह है कि यदि व्यावसायिक नियम सुरक्षा से संबंधित है (तब 401 Unauthorizedया 403 Forbiddenबेहतर होगा)। वैकल्पिक रूप से, यदि 400 भेजना किसी चीज़ के अस्तित्व के बारे में जानकारी को लीक कर देगा, और तब 404 Not Foundअधिक उपयुक्त हो सकता है।


8

नहीं तुम्हे नहीं करना चाहिए। HTTP कोड आपके एप्लिकेशन की HTTP परत के लिए हैं। व्यावसायिक नियम पूरी तरह से अलग परत है और यह एप्लिकेशन विशिष्ट है, इसलिए आपको अपने स्वयं के "प्रोटोकॉल" के साथ आने की आवश्यकता है।

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

इस प्रश्न पर वापस जाएं: आपको क्या करना चाहिए "200 ठीक है" एक शरीर के साथ यह वर्णन करते हुए कि अनुरोध के साथ क्या हुआ। विनिर्देश स्पष्ट रूप से ऐसा कहते हैं:

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec26.2.1

200 ठीक है

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

कार्रवाई का परिणाम बताने या युक्त करने वाली इकाई POST ;

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

PS: "400 बैड रिक्वेस्ट" का अर्थ है, वेब सर्वर को यह समझ में नहीं आया कि आप इससे क्या चाहते हैं। इसका अर्थ है कि आपके एप्लिकेशन के आपके सर्वर भाग को अनुरोध प्राप्त नहीं हुआ था। या कम से कम यह है कि इसका क्या मतलब है :-)

संपादित करें : मुझे बस एहसास हुआ, कि आप GST अनुरोध कर रहे हैं, POST नहीं। यह एक बुरा विचार है क्योंकि GET को आवेदन की स्थिति को नहीं बदलना चाहिए। GET को केवल सर्वर से डेटा प्राप्त करना माना जाता है। लेकिन आपके अनुरोध में आप वास्तव में एप्लिकेशन की स्थिति बदल रहे हैं, इसलिए आपको वास्तव में POST का उपयोग करना चाहिए।


1
हां, उस मामले में 404 लौटाना ठीक है। मैं यह नहीं कह रहा हूं कि सर्वर को हमेशा शरीर में स्पष्टीकरण के साथ 200 ओके भेजना चाहिए।
गोफ्री

बेहतर व्याख्या मैंने अब तक देखी। मेरा भी यही सवाल है और लगता है कि सभी शब्द मुझसे और आप से अलग सोचते हैं @GoFree
Ewerton

@GoFree एपीआई डिज़ाइन पर पुनर्विचार करने के लिए यह एक बहुत अच्छा उत्तर है। लेकिन क्या ऐसा नहीं है, कि जब हम REST API का उपयोग करते हैं, तो हम HTTP और इसके प्रतिक्रिया कोड को व्यापार नियमों की परत के प्रमुख भाग के रूप में उपयोग करते हैं?
थॉमस लौरिया

1
@ थोमस लौरिया मैंने अभी तक RESTFUL API का उचित कार्यान्वयन नहीं देखा है। हालांकि, REST API आज एक चर्चा है, इसलिए हर कंपनी को इसके बारे में वास्तव में अवधारणा को समझे बिना (शब्द, तकनीक नहीं) का उपयोग करना होगा। तो हाँ, यह हर जगह एक गलत तरीके से इस्तेमाल किया जा रहा है। जो प्रोग्रामर आमतौर पर बनाते हैं वह REST API नहीं है, बल्कि HTTP API, या API OVER HTTP है। वास्तव में कुछ अच्छे RESTFUL कार्यान्वयन में से एक HTTP स्वयं है :)
GoFree

1
200-ओके का उपयोग करना विशेष रूप से तर्कसंगत है यदि एप्लिकेशन में किसी भी व्यावसायिक-स्तरीय त्रुटियों जैसे कि इनपुट मूल्य बहुत अधिक या बहुत कम या गायब, स्टॉक से बाहर उत्पाद, आदि का वर्णन करने के लिए प्रतिक्रिया निकाय में "त्रुटि" फ़ील्ड शामिल है
रोलाण्ड

-3

यकीन नहीं है कि सभी सहमत होंगे, लेकिन हम 409 का उपयोग कर रहे हैं - संघर्ष। कई राज्य 409 सिस्टम स्टेट के साथ संघर्ष का अधिक है, लेकिन हमने यह स्वीकार किया कि स्वीकृत सीमा के बाहर होने वाले डेटा मानों का एक संघर्ष आवश्यक है और 409 का स्वीकार्य उपयोग है। 422 मुझे लगता है कि अनुरोध के रूप में उचित होगा सही ढंग से बनाया गया है, लेकिन अनुरोध के अनुसार संसाधित नहीं किया जा सकता है। हालांकि, अगर आप जवाबों के एक मेजबान को लागू करने की इच्छा नहीं रखते हैं, तो मुझे अफ़ीम करना, सिर्फ 400 देना अभी भी स्वीकार्य है।


5
409 का अर्थ है "आप जिस राज्य में इसे लगाने की कोशिश कर रहे हैं वह राज्य के साथ एक और ग्राहक इसे लगाने की कोशिश कर रहा है", यह समवर्ती लेखन को अवरुद्ध करने के लिए है (ईटैग का उपयोग करते हुए, उदाहरण के लिए)
जैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.