Was sollte ein JSON-Dienst bei einem Fehler / Fehler zurückgeben?
Schreibe ich einen JSON-service in C# (.ashx-Datei). Auf eine erfolgreiche Anfrage an den service habe ich wieder einige JSON-Daten. Wenn die Anforderung fehlschlägt, entweder, weil eine exception geworfen wurde (z.B. Datenbank-timeout) oder weil der Antrag falsch war, in irgendeiner Weise (z.B. eine ID existiert nicht in der Datenbank wurde als argument mitgegeben) wie sollte der service darauf reagieren? Was HTTP-status-codes sind sinnvoll, und sollte ich wieder irgendwelche Daten, wenn überhaupt?
Ich bin der Antizipation, der service wird vor allem der Aufruf von jQuery mit dem jQuery.form-plugin, funktioniert jQuery und das plugin irgendeine Standard-Art des Umgangs mit einer Fehlermeldung beantwortet?
EDIT: ich habe mich entschieden, ich verwende jQuery + .ashx + HTTP [status-codes] bei Erfolg werde ich JSON zurückgeben, aber auf Fehler werde ich einen string zurückgeben, da es scheint, dass das ist, was die error-option für die jQuery.ajax erwartet.
InformationsquelleAutor der Frage thatismatt | 2009-03-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den HTTP-status-code, den Sie zurückgeben sollte, hängt von der Art des aufgetretenen Fehlers. Wenn eine ID nicht in der Datenbank vorhanden return 404; wenn ein Benutzer nicht über genügend Rechte, um das Ajax-call, return 403; wenn die Datenbank mal aus, bevor Sie in der Lage, finden Sie den Datensatz zurückgeben und 500 (server error).
jQuery automatisch erkennt solche Fehler-codes und führt die callback-Funktion, die Sie definieren, in deinem Ajax-Aufruf. Dokumentation: http://api.jquery.com/jQuery.ajax/
Kurzes Beispiel für eine
$.ajax
Fehler callback:InformationsquelleAutor der Antwort Ron DeVera
Sehen diese Frage für einen Einblick in die besten Methoden für Ihre situation.
Den topline Vorschlag (vom link) ist die Standardisierung eine Antwort-Struktur (die für Erfolg und Misserfolg), dass Sie den handler sucht, fangen alle Ausnahmen, die auf der server-Ebene und die Konvertierung in der gleichen Struktur. Zum Beispiel (aus diese Antwort):
Dies ist der Ansatz stackoverflow verwendet (falls Sie sich Fragen, wie das andere machen diese Art der Sache); schreib-Operationen wie die Abstimmung haben
"Success"
und"Message"
Felder, unabhängig davon, ob ein vote erlaubt ist oder nicht:Als @Phil.H hingewiesen, Sie sollte konsistent sein in dem, was Sie wählen. Das ist leichter gesagt als getan (wie alles in der Entwicklung!).
Zum Beispiel, wenn Sie Kommentare zu schnell auf, SO dass, statt der Konsistenz und der Rückkehr
SO werden werfen Sie einen server-Ausnahme (
HTTP 500
) und fangen es in Ihrenerror
Rückruf.So viel, wie es "fühlt sich richtig" jQuery +
.ashx
+ HTTP [status-codes] IMO wird es noch komplexer, Ihre client-side code-Basis, als es Wert ist. Erkennen, dass jQuery nicht "erkennen" Fehler-codes, sondern vielmehr das fehlen einer "success" - code. Dies ist eine wichtige Unterscheidung, wenn Sie versuchen, um das design einer client um http-Antwort-codes mit jQuery. Sie bekommen nur zwei Möglichkeiten (war es ein "Erfolg" oder "Fehler"?), die Sie haben zu Niederlassung weiter auf Ihrem eigenen. Wenn Sie eine kleine Anzahl von WebServices mit einer kleinen Anzahl von Seiten, dann könnte es okay sein, aber alles im größeren Maßstab können sich chaotisch.Es ist viel natürlicher in einem
.asmx
WebService (oder WCF für diese Angelegenheit), um ein benutzerdefiniertes Objekt, als das anpassen der HTTP-status-code. Plus erhalten Sie die JSON-Serialisierung kostenlos.InformationsquelleAutor der Antwort Crescent Fresh
Mit HTTP-status-codes wäre eine Erholsamen Weg, es zu tun, aber das würde Ihnen vorschlagen, machen den rest der Schnittstelle RESTful Verwendung von Ressourcen-URIs und so weiter.
In Wahrheit, definieren Sie die Schnittstelle, wie Sie möchten (ein Fehler zurückgegeben Objekt, zum Beispiel, in dem die Eigenschaft mit dem Fehler, und ein Stück HTML-Code, der es erklärt, etc), aber sobald Sie sich entschieden haben, auf etwas, das funktioniert in einem Prototyp, werden rücksichtslos konsequent.
InformationsquelleAutor der Antwort Phil H
Ich denke, wenn Sie nur Blase eine Ausnahme, die behandelt werden sollte in der jQuery Rückruf, der übergeben wird, für die 'Fehler' - option. (Wir melden diese Ausnahme auf der server-Seite auf ein zentrales Protokoll). Keine speziellen HTTP-Fehler-code erforderlich, aber ich bin neugierig zu sehen, was andere Leute tun das auch.
Dies ist, was ich Tue, aber das ist nur meine $.02
Wenn Sie gehen, um einen Erholsamen und return-Fehler-codes, versuchen Sie, zu bleiben, um die standard-codes her durch das W3C: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
InformationsquelleAutor der Antwort Dan Esparza
Habe ich ein paar Stunden dieses problem zu lösen. Meine Lösung basiert auf der folgende Wünsche/Anforderungen:
Erstelle ich eine HandleErrorAttribute (siehe code-Kommentare zur Erläuterung der details). Ein paar details wie "aufzuhalten der Benutzung" wurde weggelassen, so könnte der code nicht kompilieren. Ich filter hinzufügen, um die Globale Filter, die während der Initialisierung der Anwendung im Allgemeinen.asax.cs wie diese:
Attribut:
Ich entwickelt habe die folgende jQuery-plugin für clientseitige Bedienbarkeit:
Was bekomme ich davon? Das Endergebnis ist, dass
Client-Seite Beispiel:
Kommentare sind herzlich willkommen! Wahrscheinlich werde ich blog über diese Lösung einige Tag...
InformationsquelleAutor der Antwort Bjarke
Ich würde auf jeden Fall zurück ein 500-Fehler mit einem JSON-Objekt, das den Fehler beschreibt Zustand, ähnlich wie ein ASP.NET AJAX "ScriptService" - Fehler zurückgibt. Ich glaube, das ist ziemlich standard. Es ist definitiv schön zu haben, dass die Kohärenz bei der Handhabung potenziell unerwarteter Fehler Bedingungen.
Beiseite, warum nicht einfach die eingebaute Funktionalität .NET, wenn Sie das schreiben in C#? WCF-und ASMX-Dienste machen es einfach, zu serialisieren der Daten als JSON, ohne das Rad neu erfinden.
InformationsquelleAutor der Antwort Dave Ward
Schienen, Gerüste benutzen
422 Unprocessable Entity
für diese Art Fehler. Sehen RFC 4918 für weitere Informationen.InformationsquelleAutor der Antwort ZiggyTheHamster
Ja, sollten Sie den HTTP-status-codes. Und auch vorzugsweise return-Fehler-Beschreibungen in eine etwas standardisierte JSON-format, wie Nottingham ' s Vorschlag, siehe apigility Error Reporting:
InformationsquelleAutor der Antwort mb21
Wenn der Benutzer ungültige Daten, es sollte auf jeden Fall ein
400 Bad Request
(Die request enthält ungültigen syntax oder kann nicht erfüllt werden.)InformationsquelleAutor der Antwort Daniel Serodio
Ich glaube nicht, dass Sie sollten sich die Rückgabe eines http-Fehler-codes, sondern benutzerdefinierte Ausnahmen, die sind nützlich, um die client-Seite der Anwendung, damit das interface weiß, was damals wirklich passiert ist. Ich würde nicht versuchen und Maske den wahren Problemen mit 404-Fehler-codes oder etwas, dass die Natur.
InformationsquelleAutor der Antwort Quintin Robinson
Für server - /Protokoll-Fehler würde ich versuchen, so zu sein wie die REST/HTTP wie möglich (Vergleichen Sie dies mit der Eingabe in URL in Ihren browser):
Für domain/business-Logik-spezifische Fehler, die ich würde sagen, das Protokoll ist in der richtigen Weg, und es gibt keine internen server-Fehler, so dass mit einer Fehlermeldung reagieren JSON/XML-Objekt oder was auch immer Sie bevorzugen zur Beschreibung Ihrer Daten mit (Vergleichen Sie dies mit dem Sie das ausfüllen von Formularen auf einer Webseite):
InformationsquelleAutor der Antwort Almer