JSON सेवा को विफलता / त्रुटि पर क्या लौटना चाहिए


79

मैं C # (.ashx फ़ाइल) में JSON सेवा लिख ​​रहा हूँ। सेवा के सफल अनुरोध पर मैं कुछ JSON डेटा लौटाता हूं। यदि अनुरोध विफल हो जाता है, या तो क्योंकि एक अपवाद को फेंक दिया गया था (जैसे डेटाबेस टाइमआउट) या क्योंकि अनुरोध किसी तरह से गलत था (उदाहरण के लिए डेटाबेस में मौजूद एक आईडी तर्क के रूप में मौजूद नहीं है) सेवा को कैसे प्रतिक्रिया देनी चाहिए? क्या HTTP स्थिति कोड समझदार हैं, और क्या मुझे कोई डेटा वापस करना चाहिए, यदि कोई हो?

मैं अनुमान लगा रहा हूं कि jQuery.form प्लगइन का उपयोग करके सेवा को मुख्य रूप से jQuery से बुलाया जाएगा, क्या jQuery या इस प्लगइन में त्रुटि प्रतिक्रिया से निपटने का कोई डिफ़ॉल्ट तरीका है?

संपादित करें: मैंने तय किया है कि मैं JSON + .ashx + HTTP [स्टेटस कोड] का उपयोग करूँगा सफलता पर मैं JSON लौटाऊंगा लेकिन त्रुटि पर मैं एक स्ट्रिंग लौटाऊंगा, क्योंकि यह प्रतीत होता है कि यही jQuery के लिए त्रुटि विकल्प है। अजाक्स की उम्मीद है।

जवाबों:


34

आपके द्वारा लौटाया गया HTTP स्टेटस कोड उस प्रकार की त्रुटि पर निर्भर होना चाहिए जो घटित हुई है। यदि कोई ID डेटाबेस में मौजूद नहीं है, तो 404 लौटाएं; यदि किसी उपयोगकर्ता के पास अजाक्स कॉल करने के लिए पर्याप्त विशेषाधिकार नहीं हैं, तो 403 लौटाएं; यदि डेटाबेस रिकॉर्ड को खोजने में सक्षम होने से पहले बाहर निकलता है, तो 500 (सर्वर त्रुटि) वापस करें।

jQuery स्वचालित रूप से ऐसे त्रुटि कोड का पता लगाता है, और कॉलबैक फ़ंक्शन को चलाता है जिसे आप अपने Ajax कॉल में परिभाषित करते हैं। दस्तावेज़ीकरण: http://api.jquery.com/jQuery.ajax/

$.ajaxत्रुटि कॉलबैक का संक्षिप्त उदाहरण :

$.ajax({
  type: 'POST',
  url: '/some/resource',
  success: function(data, textStatus) {
    // Handle success
  },
  error: function(xhr, textStatus, errorThrown) {
    // Handle error
  }
});

3
यदि आपको लगता है कि किसी को अमान्य डेटा, स्ट्रिंग की तरह एक पूर्णांक की आवश्यकता होती है, तो मुझे कौन से त्रुटि कोड की वापसी करनी चाहिए? या एक अमान्य ईमेल पता?
उस दिन

500 रेंज में कुछ, समान सर्वर साइड कोड त्रुटि के समान
annakata

7
500 रेंज एक सर्वर त्रुटि है, लेकिन सर्वर पर कुछ भी गलत नहीं हुआ है। उन्होंने एक बुरा अनुरोध किया, तो क्या यह 400 की सीमा में नहीं होना चाहिए?
वहिस्मात

38
एक उपयोगकर्ता के रूप में अगर मैं एक 500 प्राप्त करता हूं तो मुझे पता है कि मैं दोष नहीं दे रहा हूं, अगर मैं 400 को प्राप्त करता हूं तो मैं गलत काम कर सकता हूं, एपीआई लिखते समय यह विशेष रूप से महत्वपूर्ण है, क्योंकि आपके उपयोगकर्ता तकनीकी रूप से साक्षर हैं और एक 400 उन्हें एपीआई का सही उपयोग करने के लिए कहता है। पीएस - मैं मानता हूं कि एक डीबी टाइमआउट 500 होना चाहिए।
यहिस्मैट

4
केवल यह बताना चाहते हैं कि 404 का अर्थ है कि संबोधित संसाधन गायब है। इस मामले में, संसाधन आपका POST प्रोसेसर है, आईडी के साथ आपके DB में कुछ यादृच्छिक चीज नहीं है। इस मामले में 400 अधिक उपयुक्त है।
स्टीवन

56

अपनी स्थिति के लिए सर्वोत्तम प्रथाओं में कुछ अंतर्दृष्टि के लिए इस प्रश्न को देखें ।

टॉपलाइन सुझाव (उक्त लिंक से) एक प्रतिक्रिया संरचना (सफलता और विफलता दोनों के लिए) को मानकीकृत करना है जो आपके हैंडलर को दिखती है, सर्वर लेयर पर सभी अपवादों को पकड़कर उन्हें उसी संरचना में परिवर्तित करना। उदाहरण के लिए ( इस उत्तर से ):

{
    success:false,
    general_message:"You have reached your max number of Foos for the day",
    errors: {
        last_name:"This field is required",
        mrn:"Either SSN or MRN must be entered",
        zipcode:"996852 is not in Bernalillo county. Only Bernalillo residents are eligible"
    }
} 

यह दृष्टिकोण स्टैकओवरफ़्लो उपयोग है (यदि आप सोच रहे थे कि दूसरे इस तरह का काम कैसे करते हैं); वोटिंग "Success"और "Message"फील्ड जैसे ऑपरेशन लिखें , भले ही वोट की अनुमति हो या न हो:

{ Success:true, NewScore:1, Message:"", LastVoteTypeId:3 }

जैसा कि @ Phil.H ने बताया , आप जो भी चुनते हैं, उसमें आपको सुसंगत होना चाहिए। यह आसान काम की तुलना में कहा जाता है (जैसा कि विकास में सब कुछ है!)।

उदाहरण के लिए, यदि आप एसओ पर टिप्पणियां बहुत जल्दी जमा करते हैं, तो लगातार और वापस लौटने के बजाय

{ Success: false, Message: "Can only comment once every blah..." }

एसओ एक सर्वर अपवाद ( HTTP 500) को फेंक देगा और इसे अपने errorकॉलबैक में पकड़ लेगा ।

JQuery + .ashx+ HTTP [स्थिति कोड] IMO का उपयोग करने के लिए जितना यह "सही" लगता है उतना ही यह आपके क्लाइंट-साइड कोड आधार से अधिक जटिलता को जोड़ देगा। यह महसूस करें कि jQuery त्रुटि कोड का "पता लगाता" नहीं है, बल्कि एक सफलता कोड की कमी है। जब jQuery के साथ http प्रतिक्रिया कोड के आसपास क्लाइंट को डिज़ाइन करने की कोशिश कर रहा है तो यह एक महत्वपूर्ण अंतर है। आपको केवल दो विकल्प मिलते हैं (क्या यह "सफलता" या "त्रुटि" था?), जिसे आपको अपने दम पर आगे शाखा करना होगा। यदि आपके पास बहुत कम संख्या में WebServices हैं, तो यह ठीक है, लेकिन कुछ भी बड़े पैमाने पर गड़बड़ हो सकती है।

.asmxHTTP स्थिति कोड को कस्टमाइज़ करने की तुलना में किसी कस्टम ऑब्जेक्ट को वापस करने के लिए एक WebService (या उस मामले के लिए WCF) में यह बहुत अधिक स्वाभाविक है । इसके अलावा आप मुफ्त के लिए JSON क्रमांकन प्राप्त करते हैं।


1
मान्य दृष्टिकोण, सिर्फ एक नाइटिक: उदाहरण वैध JSON नहीं हैं (प्रमुख नामों के लिए दोहरे उद्धरण)
StaxMan

1
यह वही है जो मैं करता था, लेकिन आपको वास्तव में http स्थिति कोड का उपयोग करना चाहिए, यही वे वहां के लिए हैं (विशेषकर यदि आप RESTful सामान कर रहे हैं)
Eva

मुझे लगता है कि यह दृष्टिकोण निश्चित रूप से वैध है - http स्थिति कोड उपयोगी सामान करने में सहायक हैं, लेकिन इतना उपयोगी नहीं है जब, कहते हैं, आप एक स्क्रिप्ट के लिए एपीआई कॉल कर रहे हैं जिसमें डेटाबेस क्वेरी होती है। यहां तक ​​कि जब डेटाबेस क्वेरी एक त्रुटि देता है, http स्थिति कोड अभी भी 200 होगा। इस मामले में, मैं आमतौर पर 'सफलता' कुंजी का उपयोग यह इंगित करने के लिए करता हूं कि क्या MySQL क्वेरी सफल रही है या नहीं :)
टेरी

17

HTTP स्टेटस कोड का उपयोग करना इसे करने का एक RESTful तरीका होगा, लेकिन यह सुझाव देगा कि आप बाकी के संसाधन RRIful का उपयोग करके संसाधन URI और इसी तरह बना लें।

सच में, इंटरफ़ेस को अपने अनुसार परिभाषित करें (एक त्रुटि ऑब्जेक्ट लौटाएं, उदाहरण के लिए, संपत्ति को त्रुटि के साथ विस्तार करना, और HTML का एक हिस्सा जो इसे समझाता है, आदि), लेकिन एक बार जब आपने एक प्रोटोटाइप में काम करने वाले किसी चीज़ पर फैसला किया है , बेरहमी से संगत हो।


मुझे पसंद है कि आप क्या सुझाव दे रहे हैं, मैं मान रहा हूं कि आपको लगता है कि मुझे JSON वापस करना चाहिए? कुछ इस तरह: {त्रुटि: {संदेश: "एक त्रुटि हुई", विवरण: "ऐसा इसलिए हुआ क्योंकि यह सोमवार है।"}}
thatismatt

@tismism - यह काफी उचित है, यदि त्रुटियां हमेशा घातक होती हैं। अधिक ग्रैन्युलैरिटी के लिए, errorएक (संभवतः-खाली) एरे बनाकर और एक fatal_error: boolपैरामीटर जोड़ने से आपको काफी लचीलापन मिलेगा।
बेन ब्लैंक

2
ओह, और +1 जब-से-उपयोग के लिए और जब-न-उपयोग Restful प्रतिक्रियाओं के लिए। :-)
बेन ब्लैंक

रॉन डेवेरा ने समझाया है कि मैं क्या सोच रहा था!
फिल एच।

3

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

यह वही है जो मैं करता हूं, लेकिन यह सिर्फ मेरा $ .02 है

यदि आप रेस्टफुल होने जा रहे हैं और त्रुटि कोड वापस करने जा रहे हैं, तो W3C द्वारा निर्धारित मानक कोड से चिपके रहने का प्रयास करें: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


3

मैंने इस समस्या को हल करने में कुछ घंटे बिताए हैं। मेरा समाधान निम्नलिखित इच्छाओं / आवश्यकताओं पर आधारित है:

  • सभी JSON नियंत्रक क्रियाओं में दोहराए जाने वाले बॉयलरप्लेट त्रुटि हैंडलिंग कोड न रखें।
  • HTTP (त्रुटि) स्थिति कोड संरक्षित करें। क्यों? क्योंकि उच्च स्तर की चिंताओं को निचले स्तर के कार्यान्वयन को प्रभावित नहीं करना चाहिए।
  • सर्वर पर कोई त्रुटि / अपवाद होने पर JSON डेटा प्राप्त करने में सक्षम हो। क्यों? क्योंकि मैं अमीर त्रुटि जानकारी चाहते हो सकता है। उदाहरण त्रुटि संदेश, डोमेन विशिष्ट त्रुटि स्थिति कोड, स्टैक ट्रेस (डिबग / विकास वातावरण में)।
  • उपयोग की आसानी ग्राहक पक्ष - बेहतर jQuery का उपयोग कर।

मैं एक HandleErrorAttribute बनाता हूं (विवरण की व्याख्या के लिए कोड टिप्पणियां देखें)। "Usings" सहित कुछ विवरण छोड़ दिए गए हैं, इसलिए कोड संकलित नहीं हो सकता है। मैं इस तरह से Global.asax.cs में एप्लिकेशन इनिशियलाइज़ेशन के दौरान फ़िल्टर को वैश्विक फ़िल्टर में जोड़ता हूं:

GlobalFilters.Filters.Add(new UnikHandleErrorAttribute());

विशेषता:

namespace Foo
{
  using System;
  using System.Diagnostics;
  using System.Linq;
  using System.Net;
  using System.Reflection;
  using System.Web;
  using System.Web.Mvc;

  /// <summary>
  /// Generel error handler attribute for Foo MVC solutions.
  /// It handles uncaught exceptions from controller actions.
  /// It outputs trace information.
  /// If custom errors are enabled then the following is performed:
  /// <ul>
  ///   <li>If the controller action return type is <see cref="JsonResult"/> then a <see cref="JsonResult"/> object with a <c>message</c> property is returned.
  ///       If the exception is of type <see cref="MySpecialExceptionWithUserMessage"/> it's message will be used as the <see cref="JsonResult"/> <c>message</c> property value.
  ///       Otherwise a localized resource text will be used.</li>
  /// </ul>
  /// Otherwise the exception will pass through unhandled.
  /// </summary>
  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
  public sealed class FooHandleErrorAttribute : HandleErrorAttribute
  {
    private readonly TraceSource _TraceSource;

    /// <summary>
    /// <paramref name="traceSource"/> must not be null.
    /// </summary>
    /// <param name="traceSource"></param>
    public FooHandleErrorAttribute(TraceSource traceSource)
    {
      if (traceSource == null)
        throw new ArgumentNullException(@"traceSource");
      _TraceSource = traceSource;
    }

    public TraceSource TraceSource
    {
      get
      {
        return _TraceSource;
      }
    }

    /// <summary>
    /// Ctor.
    /// </summary>
    public FooHandleErrorAttribute()
    {
      var className = typeof(FooHandleErrorAttribute).FullName ?? typeof(FooHandleErrorAttribute).Name;
      _TraceSource = new TraceSource(className);
    }

    public override void OnException(ExceptionContext filterContext)
    {
      var actionMethodInfo = GetControllerAction(filterContext.Exception);
      // It's probably an error if we cannot find a controller action. But, hey, what should we do about it here?
      if(actionMethodInfo == null) return;

      var controllerName = filterContext.Controller.GetType().FullName; // filterContext.RouteData.Values[@"controller"];
      var actionName = actionMethodInfo.Name; // filterContext.RouteData.Values[@"action"];

      // Log the exception to the trace source
      var traceMessage = string.Format(@"Unhandled exception from {0}.{1} handled in {2}. Exception: {3}", controllerName, actionName, typeof(FooHandleErrorAttribute).FullName, filterContext.Exception);
      _TraceSource.TraceEvent(TraceEventType.Error, TraceEventId.UnhandledException, traceMessage);

      // Don't modify result if custom errors not enabled
      //if (!filterContext.HttpContext.IsCustomErrorEnabled)
      //  return;

      // We only handle actions with return type of JsonResult - I don't use AjaxRequestExtensions.IsAjaxRequest() because ajax requests does NOT imply JSON result.
      // (The downside is that you cannot just specify the return type as ActionResult - however I don't consider this a bad thing)
      if (actionMethodInfo.ReturnType != typeof(JsonResult)) return;

      // Handle JsonResult action exception by creating a useful JSON object which can be used client side
      // Only provide error message if we have an MySpecialExceptionWithUserMessage.
      var jsonMessage = FooHandleErrorAttributeResources.Error_Occured;
      if (filterContext.Exception is MySpecialExceptionWithUserMessage) jsonMessage = filterContext.Exception.Message;
      filterContext.Result = new JsonResult
        {
          Data = new
            {
              message = jsonMessage,
              // Only include stacktrace information in development environment
              stacktrace = MyEnvironmentHelper.IsDebugging ? filterContext.Exception.StackTrace : null
            },
          // Allow JSON get requests because we are already using this approach. However, we should consider avoiding this habit.
          JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };

      // Exception is now (being) handled - set the HTTP error status code and prevent caching! Otherwise you'll get an HTTP 200 status code and running the risc of the browser caching the result.
      filterContext.ExceptionHandled = true;
      filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; // Consider using more error status codes depending on the type of exception
      filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);

      // Call the overrided method
      base.OnException(filterContext);
    }

    /// <summary>
    /// Does anybody know a better way to obtain the controller action method info?
    /// See http://stackoverflow.com/questions/2770303/how-to-find-in-which-controller-action-an-error-occurred.
    /// </summary>
    /// <param name="exception"></param>
    /// <returns></returns>
    private static MethodInfo GetControllerAction(Exception exception)
    {
      var stackTrace = new StackTrace(exception);
      var frames = stackTrace.GetFrames();
      if(frames == null) return null;
      var frame = frames.FirstOrDefault(f => typeof(IController).IsAssignableFrom(f.GetMethod().DeclaringType));
      if (frame == null) return null;
      var actionMethod = frame.GetMethod();
      return actionMethod as MethodInfo;
    }
  }
}

मैंने उपयोग की आसानी के लिए निम्नलिखित jQuery प्लगइन विकसित किया है:

(function ($, undefined) {
  "using strict";

  $.FooGetJSON = function (url, data, success, error) {
    /// <summary>
    /// **********************************************************
    /// * UNIK GET JSON JQUERY PLUGIN.                           *
    /// **********************************************************
    /// This plugin is a wrapper for jQuery.getJSON.
    /// The reason is that jQuery.getJSON success handler doesn't provides access to the JSON object returned from the url
    /// when a HTTP status code different from 200 is encountered. However, please note that whether there is JSON
    /// data or not depends on the requested service. if there is no JSON data (i.e. response.responseText cannot be
    /// parsed as JSON) then the data parameter will be undefined.
    ///
    /// This plugin solves this problem by providing a new error handler signature which includes a data parameter.
    /// Usage of the plugin is much equal to using the jQuery.getJSON method. Handlers can be added etc. However,
    /// the only way to obtain an error handler with the signature specified below with a JSON data parameter is
    /// to call the plugin with the error handler parameter directly specified in the call to the plugin.
    ///
    /// success: function(data, textStatus, jqXHR)
    /// error: function(data, jqXHR, textStatus, errorThrown)
    ///
    /// Example usage:
    ///
    ///   $.FooGetJSON('/foo', { id: 42 }, function(data) { alert('Name :' + data.name); }, function(data) { alert('Error: ' + data.message); });
    /// </summary>

    // Call the ordinary jQuery method
    var jqxhr = $.getJSON(url, data, success);

    // Do the error handler wrapping stuff to provide an error handler with a JSON object - if the response contains JSON object data
    if (typeof error !== "undefined") {
      jqxhr.error(function(response, textStatus, errorThrown) {
        try {
          var json = $.parseJSON(response.responseText);
          error(json, response, textStatus, errorThrown);
        } catch(e) {
          error(undefined, response, textStatus, errorThrown);
        }
      });
    }

    // Return the jQueryXmlHttpResponse object
    return jqxhr;
  };
})(jQuery);

इस सब से मुझे क्या मिलेगा? अंतिम परिणाम यह है कि

  • मेरे नियंत्रक क्रियाओं में से किसी पर भी HandleErrorAttributes की आवश्यकताएं नहीं हैं।
  • मेरे किसी भी नियंत्रक क्रिया में कोई भी दोहराए जाने वाले बॉयलर प्लेट त्रुटि हैंडलिंग कोड नहीं है।
  • मेरे पास एक एकल बिंदु त्रुटि हैंडलिंग कोड है जो मुझे लॉगिंग और अन्य त्रुटि से संबंधित सामान को आसानी से बदलने की अनुमति देता है।
  • एक साधारण आवश्यकता: JsonResult को लौटाने वाले नियंत्रक क्रियाओं में रिटर्न प्रकार JsonResult होना चाहिए न कि कुछ आधार प्रकार जैसे ActionResult। कारण: FooHandleErrorAttribute में कोड टिप्पणी देखें।

ग्राहक पक्ष का उदाहरण:

var success = function(data) {
  alert(data.myjsonobject.foo);
};
var onError = function(data) {
  var message = "Error";
  if(typeof data !== "undefined")
    message += ": " + data.message;
  alert(message);
};
$.FooGetJSON(url, params, onSuccess, onError);

टिप्पणियों का स्वागत है! मैं शायद किसी दिन इस समाधान के बारे में ब्लॉग करूँगा ...


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

2

मैं निश्चित रूप से त्रुटि स्थिति का वर्णन करने वाली एक JSON ऑब्जेक्ट के साथ एक 500 त्रुटि लौटाऊंगा , कैसे एक ASP.NET AJAX "ScriptService" त्रुटि रिटर्न के समान । मेरा मानना ​​है कि यह काफी मानक है। संभावित अप्रत्याशित त्रुटि स्थितियों को संभालते समय उस स्थिरता का होना निश्चित रूप से अच्छा है।

इसके अलावा, क्यों न ही .NET में कार्यक्षमता का निर्माण किया जाए, यदि आप इसे C # में लिख रहे हैं? WCF और ASMX सेवाएं पहिया को फिर से स्थापित किए बिना, JSON के रूप में डेटा को अनुक्रमित करना आसान बनाती हैं।


मुझे नहीं लगता कि इस संदर्भ में 500 त्रुटि कोड का उपयोग किया जाना चाहिए। विनिर्देश के आधार पर: w3.org/Protocols/rfc2616/rfc2616-sec10.html , सबसे अच्छा विकल्प 400 (खराब अनुरोध) भेजना है। 500 त्रुटि एक अखंड अपवाद के लिए अधिक उपयुक्त है।
गेब्रियल माजेटो

2

422 Unprocessable Entityइस प्रकार की त्रुटियों के लिए रेल मचान का उपयोग किया जाता है। अधिक जानकारी के लिए RFC 4918 देखें ।


2

हाँ, आपको HTTP स्थिति कोड का उपयोग करना चाहिए। और नॉटिंघम के प्रस्ताव जैसे कुछ मानकीकृत JSON प्रारूप में अधिमानतः त्रुटि विवरण लौटाएं , माफी संबंधी त्रुटि रिपोर्ट देखें :

API समस्या के पेलोड में निम्नलिखित संरचना है:

  • प्रकार : त्रुटि स्थिति का वर्णन करने वाले दस्तावेज़ का URL (वैकल्पिक, और "के बारे में: रिक्त" मान लिया जाता है यदि कोई भी प्रदान नहीं किया गया है; उसे मानव-पठनीय दस्तावेज़ में हल करना चाहिए ; योग्यता हमेशा यह प्रदान करता है)।
  • शीर्षक : त्रुटि स्थिति के लिए एक संक्षिप्त शीर्षक (आवश्यक; और एक ही प्रकार की हर समस्या के लिए एक ही होना चाहिए ; योग्यता हमेशा यह प्रदान करता है)।
  • स्थिति : वर्तमान अनुरोध के लिए HTTP स्थिति कोड (वैकल्पिक; योग्यता हमेशा यह प्रदान करता है)।
  • विस्तार : त्रुटि विवरण इस अनुरोध के लिए विशिष्ट है (वैकल्पिक; योग्यता प्रत्येक समस्या के लिए आवश्यक है)।
  • उदाहरण : यूआरआई इस समस्या के विशिष्ट उदाहरण की पहचान कर रहा है (वैकल्पिक; वर्तमान में यह क्षमता प्रदान नहीं करता है)।

1

यदि उपयोगकर्ता अमान्य डेटा की आपूर्ति करता है, तो यह निश्चित रूप से होना चाहिए 400 Bad Request( अनुरोध में खराब सिंटैक्स शामिल है या पूरा नहीं किया जा सकता है। )


400 में से कोई भी रेंज स्वीकार्य है और 422 डाटा के लिए सबसे अच्छा विकल्प है जिसे संसाधित नहीं किया जा सकता है
jamesc

0

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


क्या आप सुझाव दे रहे हैं कि मैं 200 वापस कर दूं भले ही कुछ गलत हो जाए? आपका क्या मतलब है "कस्टम अपवाद"? क्या आपका मतलब है कि त्रुटि का वर्णन करने वाला JSON का एक टुकड़ा है?
उस दिन

4
ब्लाह, http कोड लौटाने का मतलब यह नहीं है कि आप त्रुटि विवरण संदेश भी नहीं दे सकते। 200 वापस करने के बजाय मूर्खतापूर्ण होगा गलत उल्लेख नहीं है।
StaxMan

@StaxMan के साथ सहमत - हमेशा सबसे अच्छा स्थिति कोड लौटाएं, लेकिन रिटर्निंग जानकारी में विवरण शामिल करें
schmoopy

0

सर्वर / प्रोटोकॉल त्रुटियों के लिए मैं यथासंभव REST / HTTP होने की कोशिश करूँगा (इसकी तुलना आप अपने ब्राउज़र में URL टाइप करके कर सकते हैं):

  • एक गैर मौजूदा आइटम कहा जाता है (/ व्यक्तियों / {गैर-मौजूदा-आईडी-यहाँ})। 404 वापस करें।
  • सर्वर (कोड बग) पर एक अप्रत्याशित त्रुटि हुई। 500 लौटाओ।
  • क्लाइंट उपयोगकर्ता संसाधन प्राप्त करने के लिए अधिकृत नहीं है। 401 वापस करें।

डोमेन / व्यापार तर्क विशिष्ट त्रुटियों के लिए, मैं कहूंगा कि प्रोटोकॉल का सही तरीके से उपयोग किया गया है और इसमें सर्वर की कोई आंतरिक त्रुटि नहीं है, इसलिए त्रुटि के साथ प्रतिक्रिया दें JSON / XML ऑब्जेक्ट या जो भी आप अपने डेटा का वर्णन करना पसंद करते हैं (इसमें आपके द्वारा भरने के साथ तुलना करें) वेबसाइट पर प्रपत्र):

  • एक उपयोगकर्ता अपना खाता नाम बदलना चाहता है, लेकिन उपयोगकर्ता ने अभी तक ईमेल में एक लिंक पर क्लिक करके अपने खाते को सत्यापित नहीं किया था जो उपयोगकर्ता को भेजा गया था। वापसी {"त्रुटि": "खाता सत्यापित नहीं"} या जो भी हो।
  • एक उपयोगकर्ता एक पुस्तक ऑर्डर करना चाहता है, लेकिन पुस्तक बेची गई (राज्य DB में बदल गई) और अब और आदेश नहीं दिया जा सकता है। वापसी {"त्रुटि": "पहले से ही बेची गई पुस्तक"}।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.