सत्यापन विफलता के लिए REST API सेवा द्वारा लौटने के लिए एक उपयुक्त HTTP स्थिति कोड क्या है?


394

जब भी मैं अपने Django / पिस्टन आधारित REST API एप्लिकेशन में सत्यापन विफलता का सामना करता हूं, तो मैं 401 अनधिकृत रूप से लौट रहा हूं । HTTP स्थिति कोड रजिस्ट्री पर एक नज़र रखने के बाद मुझे विश्वास नहीं हो रहा है कि यह सत्यापन विफलता के लिए एक उपयुक्त कोड है, आप क्या सलाह देंगे?

  • 400 गलत अनुरोध
  • अनधिकृत 401
  • 403 निषिद्ध
  • 405 विधि अनुमति नहीं है
  • 406 स्वीकार्य नहीं है
  • 412 पूर्वधारणा विफल
  • 417 उम्मीद असफल रही
  • 422 असंसाधित इकाई
  • 424 असफलता निर्भरता

अद्यतन : ऊपर "वैधता विफलता" का अर्थ है एक आवेदन स्तर डेटा सत्यापन विफलता, अर्थात, गलत तरीके से निर्दिष्ट डेटाइम, फर्जी ईमेल ईमेल आदि।


2
इस उत्तर को देखें: stackoverflow.com/a/2657624/221612
केनी मेयर

3
Fwiw, केनी की लिंक कोड 422 का सुझाव देती है, क्योंकि जिम का जवाब अब नीचे दिया गया है । #TheMoreYouKnow #SavingYouAClick
Ruffin

मुझे लगता है कि 401 अधिक स्पष्ट है।
इंस्पायर करें

जवाबों:


298

यदि "सत्यापन विफलता" का अर्थ है कि अनुरोध में कुछ क्लाइंट त्रुटि है, तो HTTP 400 (खराब अनुरोध) का उपयोग करें। उदाहरण के लिए यदि URI के पास ISO-8601 तारीख है और आप पाते हैं कि यह गलत प्रारूप में है या 31 फरवरी को संदर्भित होता है, तो आप एक HTTP 400 लौटा देंगे। यदि आप किसी निकाय निकाय में XML की अच्छी तरह से अपेक्षा करते हैं तो आप Ditto यह पार्स करने में विफल रहता है।

(1/2016): पिछले पांच वर्षों में WebDAV के विशिष्ट HTTP 422 (Unprocessable Entity) HTTP 400 के लिए एक बहुत ही उचित विकल्प बन गया है। उदाहरण के लिए JSON API में इसका उपयोग देखें । लेकिन ध्यान दें कि HTTP 422 ने इसे HTTP 1.1, RFC-7231 में नहीं बनाया है ।

रिचर्डसन और रूबी की रैस्टफुल वेब सेवाओं में विभिन्न HTTP प्रतिक्रिया कोड का उपयोग करने पर एक बहुत ही उपयोगी परिशिष्ट शामिल है। वे कहते हैं:

400 ("बुरा अनुरोध")
महत्व: उच्च।
यह सामान्य क्लाइंट-साइड त्रुटि स्थिति है, जिसका उपयोग तब किया जाता है जब कोई अन्य 4xx त्रुटि कोड उपयुक्त न हो। इसका उपयोग आमतौर पर तब किया जाता है जब ग्राहक PUT या POST अनुरोध के साथ एक प्रतिनिधित्व प्रस्तुत करता है, और प्रतिनिधित्व सही प्रारूप में होता है, लेकिन इसका कोई मतलब नहीं है। (पृष्ठ ३ 38१)

तथा:

401 ("अनधिकृत")
महत्व: उच्च।
क्लाइंट ने उचित प्रमाणीकरण क्रेडेंशियल्स प्रदान किए बिना एक संरक्षित संसाधन पर काम करने की कोशिश की। इसने गलत प्रमाणिकता प्रदान की हो सकती है, या कोई भी नहीं। क्रेडेंशियल एक उपयोगकर्ता नाम और पासवर्ड, एक एपीआई कुंजी, या एक प्रमाणीकरण टोकन हो सकता है - जो भी प्रश्न में सेवा की अपेक्षा कर रहा है। किसी क्लाइंट के लिए URI के लिए अनुरोध करना और 401 को स्वीकार करना सामान्य है, इसलिए यह जानता है कि किस तरह के क्रेडेंशियल भेजने और किस प्रारूप में हैं। [...]


3
लेकिन शायद अगर URI प्रारूप अमान्य है तो 404 अधिक उपयुक्त हो सकता है।
मनु

11
@ReWrite द्वारा कहा गया है, मुझे भी लगता है कि 422 सत्यापन त्रुटियों के लिए बेहतर है।
पैंती

11
मैं कहूंगा कि यह गलत है। 400 बैड रिक्वेस्ट का इस्तेमाल तब किया जाता है जब रिक्वेस्ट में सिंटैक्टली कुछ गड़बड़ हो। मेरा कहना है कि ReWrite 422 की सिफारिश करने में सही है जो अनुरोध की सामग्री के बारे में है
स्टिजन डे विट

3
@ केनजी हां, 401 ("अनधिकृत"): "हो सकता है कि इसने गलत क्रेडेंशियल्स प्रदान किए हों ..." का अर्थ है गलत उपयोगकर्ता और / या पासवर्ड।
razzintown

4
@JimFerrans 400 त्रुटियां उस स्थान के लिए हैं जहां दिया गया सिंटैक्स गलत है। 401 त्रुटियां विशेष रूप से होती हैं अगर मैं किसी ऐसे पृष्ठ पर पहुंचने का प्रयास कर रहा हूं जिसे मुझे एक्सेस करने के लिए लॉग इन करना होगा और मैं लॉग इन नहीं हूं। 422 त्रुटियों के लिए जहां सिंटैक्स सही है, लेकिन सर्वर सेवा से इनकार कर रहा है। गलत उपयोगकर्ता नाम / पासवर्ड सही सिंटैक्स है (400 त्रुटि नहीं) और मैं उस पृष्ठ तक पहुंचने की कोशिश नहीं कर रहा हूं, जिसके लिए मुझे लॉग इन करने की आवश्यकता है क्योंकि मैं स्वयं लॉगिन पृष्ठ (401 त्रुटि नहीं) का उपयोग कर रहा हूं। 401 त्रुटि का उपयोग सेटिंग्स पेज की तरह कुछ के लिए किया जाना चाहिए जिसे केवल एक उपयोगकर्ता ही एक्सेस कर सकता है
Zachary Weixelbaum

98

RFC 4918 से (और http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml पर भी प्रलेखित ):

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



28

डेटाबेस में एक डुप्लिकेट होना चाहिए 409 CONFLICT

मैं 422 UNPROCESSABLE ENTITYसत्यापन त्रुटियों के लिए उपयोग करने की सलाह देता हूं ।

मैं यहां 4xx कोडों की लंबी व्याख्या देता हूं: http://parker0phil.com/2014/10/16/REST_http_4xx_status_codes_syntax_and_sematics/


19

यह रहा:

rfc2616 # अनुभाग-10.4.1 - 400 खराब अनुरोध

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

rfc7231 # अनुभाग-6.5.1 - 6.5.1। 400 गलत अनुरोध

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

विकृत (विकृत नहीं) मामलों को संदर्भित करता है!

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

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

निष्कर्ष

अंगूठे का नियम: [_] 00 सबसे सामान्य मामले और मामलों को कवर करता है जो निर्दिष्ट कोड द्वारा कवर नहीं किए जाते हैं।

422 सबसे अच्छी वस्तु सत्यापन त्रुटि को ठीक करता है (ठीक मेरी अनुशंसा :)
जैसा शब्दार्थ के लिए गलत है - "यह उपयोगकर्ता नाम पहले से मौजूद है" कुछ ऐसा ही सोचें।

400 का उपयोग वस्तु सत्यापन के लिए गलत तरीके से किया जाता है


9

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

यदि वास्तव में ऐसा है, तो मैं एप्लिकेशन त्रुटियों के साथ प्रतिक्रिया में एक स्थिति फ़ील्ड जोड़ूंगा, जैसे

<स्थिति> <कोड> 4 </ कोड> <संदेश> दिनांक सीमा अमान्य है </ संदेश> </ स्थिति>


1

RFC 2616 में इन त्रुटियों के शब्दार्थ के बारे में थोड़ी अधिक जानकारी है , जो HTTP 1.1 का दस्तावेज है।

निजी तौर पर, मैं शायद उपयोग करूंगा 400 Bad Request, लेकिन बिना किसी तथ्यात्मक समर्थन के यह सिर्फ मेरी निजी राय है।


0

"सत्यापन विफलता" से आपका वास्तव में क्या तात्पर्य है? आप क्या मान्य कर रहे हैं? क्या आप सिंटैक्स त्रुटि (जैसे विकृत XML) जैसी किसी चीज़ का जिक्र कर रहे हैं?

अगर ऐसा है, तो मैं कहूंगा कि 400 खराब अनुरोध शायद सही बात है, लेकिन यह जानने के बिना कि आप "मान्य" हैं, यह कहना असंभव है।


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