Antworten:
Der Status 422 scheint aufgrund der Spezifikation am angemessensten zu sein .
Der Statuscode 422 (nicht verarbeitbare Entität) bedeutet, dass der Server den Inhaltstyp der Anforderungsentität versteht (daher ist ein 415-Statuscode (nicht unterstützter Medientyp) unangemessen) und die Syntax der Anforderungsentität korrekt ist (daher eine 400 (fehlerhafte Anforderung) ) Statuscode ist unangemessen) konnte die enthaltenen Anweisungen jedoch nicht verarbeiten. Diese Fehlerbedingung kann beispielsweise auftreten, wenn ein XML-Anforderungshauptteil wohlgeformte (dh syntaktisch korrekte), aber semantisch fehlerhafte XML-Anweisungen enthält.
Sie geben an, dass fehlerhafte XML ein Beispiel für eine schlechte Syntax ist (die eine 400 erfordert). Eine fehlerhafte Abfragezeichenfolge scheint analog zu dieser zu sein, daher scheint 400 für eine wohlgeformte Abfragezeichenfolge, bei der ein Parameter fehlt, nicht geeignet zu sein.
UPDATE @DavidV weist korrekt darauf hin, dass diese Spezifikation für WebDAV und nicht für Kern-HTTP gilt. Einige beliebte Nicht-WebDAV-APIs verwenden jedoch ohnehin 422, da kein besserer Statuscode vorhanden ist ( siehe hier ).
400
das für angemessener.
Ich bin mir nicht sicher, ob es einen festgelegten Standard gibt, aber ich hätte 400 Bad Request verwendet , was die neueste HTTP-Spezifikation (ab 2014) wie folgt dokumentiert :
6.5.1. 400 schlechte AnfrageDer Statuscode 400 (Bad Request) gibt an, dass der Server die Anforderung aufgrund eines als Clientfehler wahrgenommenen Fehlers nicht verarbeiten kann oder will (z. B. fehlerhafte Anforderungssyntax, ungültiges Anforderungsnachrichten-Framing oder irreführendes Anforderungsrouting).
400 Bad Request
soll auf Probleme auf Protokollebene hinweisen, nicht auf semantische Fehler. Wenn wir HTTP-Statuscodes entführen, um Fehler auf Anwendungsebene (und nicht auf Protokollebene) anzuzeigen, warum nicht den ganzen Weg gehen und einfach verwenden 412
?
Die WCF-API in .NET behandelt fehlende Parameter, indem HTTP 404
bei Verwendung von webHttpBinding der Fehler "Endpunkt nicht gefunden" zurückgegeben wird .
Dies 404 Not Found
kann sinnvoll sein, wenn Sie den Namen Ihrer Webdienstmethode zusammen mit der Parametersignatur berücksichtigen. Das heißt, wenn Sie eine Webdienstmethode verfügbar machen LoginUser(string, string)
und dies anfordern LoginUser(string)
, wird letztere nicht gefunden.
Grundsätzlich würde dies bedeuten, dass die von Ihnen aufgerufene Webdienstmethode zusammen mit der von Ihnen angegebenen Parametersignatur nicht gefunden werden kann.
10.4.5 404 Nicht gefunden
Der Server hat nichts gefunden, das mit dem Request-URI übereinstimmt. Es wird kein Hinweis darauf gegeben, ob der Zustand vorübergehend oder dauerhaft ist.
Die 400 Bad Request
, als Gert vorschlug , bleibt ein gültiger Antwortcode, aber ich denke, er wird normalerweise verwendet, um Probleme auf niedrigerer Ebene anzuzeigen. Es kann leicht als fehlerhafte HTTP-Anforderung interpretiert werden, möglicherweise fehlende oder ungültige HTTP-Header oder ähnliches.
10.4.1 400 Bad Request
Die Anforderung konnte vom Server aufgrund einer fehlerhaften Syntax nicht verstanden werden. Der Client sollte die Anfrage NICHT ohne Änderungen wiederholen.
In einem unserer API-Projekte entscheiden wir uns, einen 409-Status für eine Anforderung festzulegen, wenn wir ihn aufgrund fehlender Parameter nicht zu 100% vollständig ausfüllen können.
Der HTTP-Statuscode "409 Conflict" war für uns ein guter Versuch, da für die Definition genügend Informationen erforderlich sein müssen, damit der Benutzer die Ursache des Konflikts erkennen kann.
Referenz: w3.org/Protocols/
Unter anderen Antworten wie 400 oder 404 haben wir 409 ausgewählt, um die Notwendigkeit zu erzwingen, einige Notizen in der Anfrage zu überprüfen, die hilfreich sind, um eine neue und richtige Anfrage einzurichten.
In jedem Fall war dies besonders wichtig, da wir am Vorabend einige Daten senden müssen, wenn die Anfrage nicht vollständig korrekt war, und wir müssen den Client dazu zwingen, die Nachricht zu lesen und zu verstehen, was in der Anfrage falsch war.
Wenn wir nur einige fehlende Parameter haben, wählen wir im Allgemeinen eine 400 und ein Array fehlender Parameter. Wenn wir jedoch weitere Informationen senden müssen, z. B. eine bestimmte Fallnachricht, und wir möchten sicherer sein, dass der Kunde sich darum kümmert, senden wir eine 409
Normalerweise entscheide ich mich für 422 (nicht verarbeitbare Entität), wenn etwas in den erforderlichen Parametern nicht mit dem erforderlichen API-Endpunkt übereinstimmt (wie ein zu kurzes Kennwort), aber für einen fehlenden Parameter würde ich mich für 406 (nicht akzeptabel) entscheiden.
Accept-Language: de
, die angibt, dass nur Antworten auf Deutsch akzeptiert werden. Die einzigen Versionen des angeforderten Dokuments, über die Ihr Server verfügt, sind jedoch auf Englisch oder Französisch.) Die Verwendung zur Angabe eines fehlenden Parameters in der Anfrage ist falsch. gemäß der Definition in spec.
Für Interessenten gibt Spring MVC (mindestens 3.x) in diesem Fall eine 400 zurück, was mir falsch erscheint.
Ich habe mehrere Google-URLs (accounts.google.com) getestet und die erforderlichen Parameter entfernt. In diesem Fall wird im Allgemeinen eine 404 zurückgegeben.
Ich würde Google kopieren.
Es könnte argumentiert werden, dass a 404 Not Found
verwendet werden sollte, da die angegebene Ressource nicht gefunden werden konnte.
Ich verwende oft einen 403 Forbidden-Fehler. Der Grund ist, dass die Anfrage verstanden wurde, aber ich werde nicht tun, was gefragt wurde (weil die Dinge falsch sind). Die Antwortentität erklärt, was falsch ist. Wenn es sich bei der Antwort also um eine HTML-Seite handelt, befinden sich die Fehlermeldungen auf der Seite. Wenn es sich um eine JSON- oder XML-Antwort handelt, sind die Fehlerinformationen dort enthalten.
Von rfc2616 :
10.4.4 403 Verboten
Der Server hat die Anfrage verstanden, weigert sich jedoch, sie zu erfüllen.
Die Autorisierung hilft nicht und die Anfrage sollte nicht wiederholt werden.
Wenn die Anforderungsmethode nicht HEAD war und der Server veröffentlichen möchte,
warum die Anforderung nicht erfüllt wurde, SOLLTE er den Grund für die Ablehnung in der Entität beschreiben. Wenn der Server diese Informationen dem Client nicht zur Verfügung stellen möchte,
kann stattdessen der Statuscode 404 (Nicht gefunden) verwendet werden.
Authorization will not help
, dass Twitter dies nicht für ungültige OAuth-Anmeldeinformationen senden sollte.
401 Unauthorized
stattdessen eine senden . Sie können jedoch verstehen, warum dies nicht der Fall ist, wenn Sie sich die Beschreibungen dieser beiden Codes in den MDN-Dokumenten ansehen , die sehr ähnlich sind.
Um ASP.NET Core als Referenz oder Beispiel zu verwenden, können Sie mit ASP.NET Core einen Controller mit Aktionen einrichten. So sieht die Aktion "Details" aus.
// GET: Cars/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var car = await _context.Cars.FirstOrDefaultAsync(m => m.CarId == id);
if (car == null)
{
return NotFound();
}
return View(car);
}
Wenn der Parameter id
nicht festgelegt ist, wird 404 Not Found zurückgegeben.
Geben Sie eine 404 zurück - was bedeutet, dass die Ressource nicht gefunden wurde.
Versuchen Sie, eine URL einer Site zu bearbeiten, die eine ID enthält. Ich habe ein paar ausprobiert:
Alle geben 404 zurück, imo, weil diese Entwickler den Standard richtig interpretieren, was die Antwort hier und viele andere nicht sind!
requestBody
.
Ich würde mit einem 403 fahren.
Von RFC 2616 - Hypertext Transfer Protocol - HTTP / 1.1
403 Verboten
Der Server hat die Anfrage verstanden, weigert sich jedoch, sie zu erfüllen. Die Autorisierung hilft nicht und die Anfrage sollte nicht wiederholt werden. Wenn die Anforderungsmethode nicht HEAD war und der Server veröffentlichen möchte, warum die Anforderung nicht erfüllt wurde, sollte der Grund für die Ablehnung in der Entität beschrieben werden. Wenn der Server diese Informationen dem Client nicht zur Verfügung stellen möchte, kann stattdessen der Statuscode 404 (Nicht gefunden) verwendet werden.
Sie sollten den Grund für den Fehler in Ihrer Antwort beschreiben. Wenn Sie es lieber nicht tun möchten, verwenden Sie einfach 404.