Welchen HTTP-Statusantwortcode sollte ich verwenden, wenn in der Anforderung ein erforderlicher Parameter fehlt?

Antworten:

388

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 ).

Kelvin
quelle
2
IMO Ich würde dies verwenden, wenn der Wert in der Abfragezeichenfolge falsch war, nicht wenn ein zusätzlicher Wert oder ein fehlender Wert vorhanden war. dh. Die Erwartung einer E-Mail und ihres Werts ist '123123'
Derek Litz
2
Ich neige dazu, GET- und POST-Parameter als Methodensignatur des URL-Pfads zu betrachten, daher ist 404 für mich sinnvoll. In einer RESTful-API, die für den öffentlichen Gebrauch bestimmt ist, ist es ratsam, die fehlenden / zusätzlichen Parameter zurückzugeben. Im Kontext einer URL sind die Parameter der Abfragezeichenfolge normalerweise wichtig, um eine Ressource zu identifizieren, und zusätzliche oder fehlende Parameter stellen eine Ressource dar, die ohne Annahmen nicht vorhanden ist. Natürlich gibt es Kompromisse bei der Robustheit, indem sie explizit sind, und optionale Parameter machen eine Ressource möglicherweise genauso anfällig für stille Fehler. Dann gibt es Benutzerfreundlichkeit ...
Derek Litz
13
Die angegebene Spezifikation gilt für WebDAV und ist nicht die HTTP-Standardspezifikation.
David V
1
@ Kelvin Danke, dass du auf diesen Blog-Beitrag hingewiesen hast. Es ist hilfreich zu sehen, dass Twitter beispielsweise 422 verwendet. Ich denke, die Antwort könnte besser sein, wenn Sie in der ersten Zeile klarstellen, dass die Spezifikation WebDAV ist. Als ich Ihre Antwort zum ersten Mal las, dachte ich, Sie meinten die HTTP-Standardspezifikation, bis ich dem Link folgte.
David V
3
Dies ist eine Lektüre wert: bennadel.com/blog/… Ich würde 422 auch nicht für fehlende Parameter verwenden. Ich halte 400das für angemessener.
Zelphir Kaltstahl
184

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 Anfrage

Der 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).

Gert Grenander
quelle
65
400 Bad Requestsoll 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?
Matt Zukowski
36
Die OAuth 1.0-Implementierung von Google stimmt dieser Antwort zu. Eine 400-Antwort wird gegeben, wenn POST-Parameter fehlen oder nicht unterstützt werden: code.google.com/apis/accounts/docs/OAuth_ref.html
Tom
1
@ matt-zukowski: "412: Die in einem oder mehreren der Anforderungsheaderfelder angegebene Voraussetzung wurde beim Testen auf dem Server als falsch ausgewertet." von RFC2616 - Wenn es sich um einen POST handelt, befinden sich die Parameter im Anforderungshauptteil und nicht in den Anforderungsheaderfeldern. Technisch gesehen sendet die GET-Methode ihre Parameter in den Anforderungsheadern, aber ich möchte stattdessen lieber eine gewisse Konsistenz haben?
Tong
6
@MattZukowski 400 ist ein Statuscode auf Anwendungsebene. Wenn Sie sich die Umformulierung in der Entwurfsversion von RFC 7231 ansehen, werden Sie das sehen. Leider ist der Wortlaut in der neuesten Version nicht so klar, weil der Autor der letzten Änderungen auch 422 erfunden hat.
Darrel Miller
9
@DarrelMiller ist richtig ( direkter Link ): "Der Statuscode 400 (Bad Request) zeigt an, dass der Server die Anforderung aufgrund eines als Clientfehler wahrgenommenen Fehlers nicht verarbeiten kann oder will (z. B. fehlerhafte Anforderungssyntax, ungültige Anforderungsnachricht) Framing oder irreführendes Anforderungsrouting). " Abhängig von der Semantik und den Erweiterungserwartungen (wird es eines Tages möglich sein, eine Anforderung ohne den Parameter auszugeben?), Scheinen in Standard-HTTP nur 400 und 404 angemessen. Andernfalls erfinden Sie einen neuen Code für Ihre API, aber überladen Sie die Semantik nicht.
Der
31

Die WCF-API in .NET behandelt fehlende Parameter, indem HTTP 404bei Verwendung von webHttpBinding der Fehler "Endpunkt nicht gefunden" zurückgegeben wird .

Dies 404 Not Foundkann 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.

Daniel Vassallo
quelle
Dies macht CherryPy standardmäßig.
Derek Litz
Was ist mit der Bearbeitung einer Post-Anfrage, bei der Sie ein Modell akzeptieren und ein Teil des Modells fehlt? In diesem Fall erhalten Sie keine 404. Stattdessen erhalten Sie ein Modell, das nicht gültig ist, wenn ich mich nicht irre, und Sie müssen entscheiden, was jetzt zu tun ist.
Shane Courtrille
1
Diese Interpretation scheint eine Strecke zu sein und drückt eher einen RPC als einen REST-POV aus. Der URI ist der Bezeichner und existiert und wurde gefunden. Was im Body gesendet wird, ist nicht Teil der Ressourcen-ID. 422 ist angemessener.
Jonah
404 ist die richtige Antwort. Bearbeiten Sie einfach einige URLs im Web, um den Konsens zu finden!
Jenson-Button-Event
8

Sie können einen 400 Bad Request Code senden. Es ist einer der allgemeineren 4xx-Statuscodes, sodass Sie damit meinen, was Sie beabsichtigen: Der Client sendet eine Anfrage, bei der Informationen / Parameter fehlen, die Ihre Anwendung benötigt, um sie korrekt zu verarbeiten.

BoltClock
quelle
7

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

gabrielem
quelle
2
Das ist einfach falsch. 409 ist für Parallelitätsprobleme vorgesehen, da @ MaximeGélinas auf ODER-Situationen hinweist, in denen eine Ressource bereits vorhanden ist und Duplikate nicht zulässig sind.
Gimlichael
Gemäß Spezifikation gibt der Statuscode 409 (Konflikt) an, dass die Anforderung aufgrund eines Konflikts mit dem aktuellen Status der Zielressource nicht abgeschlossen werden konnte. . Die Verwendung für einen fehlenden Parameter ist einfach falsch. Das ist eine ganz andere Art von Fehler.
Mark Amery
5

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.

Elad Meidar
quelle
8
Nun, 406 Unacceptable wird mit Accept Header verwendet (wenn der Server keine Antwort senden kann, wird der Client dies verstehen). "Die durch die Anforderung identifizierte Ressource kann nur Antwortentitäten generieren, deren Inhaltsmerkmale gemäß den in der Anforderung gesendeten Akzeptanzheadern nicht akzeptabel sind." . Ich bin mit 422 festgefahren, da es mit der aktuellen Spezifikation keine "richtige" Wahl gibt: - /
JakubKnejzlik
Die Verwendung von 406 ist falsch. Ein 406-Code bedeutet nicht, dass die Anforderung nicht akzeptabel war. Dies bedeutet, dass Sie die Anforderung nicht erfüllen können, da die Antworten, die Sie bedienen können, vom Client als nicht akzeptabel eingestuft werden, basierend auf den in der Anforderung gesendeten Accept-Headern. (Zum Beispiel ist die Anfrage enthalten 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.
Mark Amery
3

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.

Neromant
quelle
18
Weil Google es tut, heißt das nicht automatisch, dass Google es richtig macht!
rve
4
Ich stimme zu, nicht unbedingt "richtig", aber manchmal sind zwei verschiedene Dinge richtig und sinnvoll. Wie auch immer .. bis zum Leser :)
Neromancer
Einige Google APIs geben eine 400 zurück, z. B. github.com/google/google-api-nodejs-client/issues/404
Dennis
was falsch ist (und warum spring mvc nicht jax-rs-konform ist)
jenson-button-event
3

Es könnte argumentiert werden, dass a 404 Not Foundverwendet werden sollte, da die angegebene Ressource nicht gefunden werden konnte.

Strahl
quelle
3
Dies ist das Standardverhalten von Java JAX-RS, wenn ein Abfrageparameter nicht in den richtigen Datentyp konvertiert werden kann. Dem stimme ich allerdings nicht zu. Die Ressource wurde gefunden: Abfrageparameter dienen zum Filtern der Ressource, und einer der Filter wurde mit einem nicht akzeptablen Wert versehen. Ich denke, dies entspricht 422 nicht verarbeitbaren Entitäten am nächsten und 400 Bad Request am zweitnächsten.
Ryan
Es ist das Standardverhalten von jax-rs, weil es das richtige Verhalten ist!
Jenson-Button-Event
Die Verwendung eines 404 ist sinnvoll, wenn der Abfragezeichenfolgenparameter eine Ressource identifizieren soll. Es wurde ein Wert angegeben, dieser Wert entspricht jedoch nicht einer vorhandenen Ressource - beispielsweise, wenn Sie example.com/show-user anfordern -profile? user_id = 123 und Benutzer 123 existiert nicht. Aber darum ging es bei dieser Frage nicht. Es ging um das Szenario, in dem ein erforderlicher Parameter vollständig weggelassen wird. Ich sehe nicht, wie das einer bestimmten Ressource entspricht, die nicht gefunden wurde.
Mark Amery
2

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.

cdeszaq
quelle
4
Hört sich anfangs gut an, obwohl ich dies natürlich mit Authentifizierungs- oder Berechtigungsfehlern in Verbindung bringen würde. Die Spezifikation weist auch darauf hin, wo "wenn der Server diese Informationen dem Client nicht zur Verfügung stellen möchte" steht. Auch dieser 404 könnte eine bessere Option sein. Ich würde in Richtung einer 404 oder 400 als einer 403 fahren.
Tonyhb
21
Dies ist eine schreckliche Idee, auch wenn sie technisch einwandfrei ist. 403 wird allgemein für Antworten auf Authentifizierungsfehler verwendet, und Sie werden Ihre Clients verdammt verwirren, wenn Sie versuchen, dies zu verwenden, um Parameterfehler anzuzeigen. Zum Beispiel tut Twitter dies - 403 wird sowohl verwendet, wenn Sie ungültige OAuth-Anmeldeinformationen angeben, als auch wenn Ihre Anfrage semantisch nicht stimmt - und es ist eine ständige Quelle der Verwirrung für API-Clients.
Matt Zukowski
1
@ MattZukowski gut das ist einfach falsch. Die Spezifikation besagt Authorization will not help, dass Twitter dies nicht für ungültige OAuth-Anmeldeinformationen senden sollte.
Torvin
@torvin Twitter sollte 401 Unauthorizedstattdessen 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.
Agi Hammerthief
-1

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 idnicht festgelegt ist, wird 404 Not Found zurückgegeben.

Fred
quelle
-5

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:

  • Gitub Repo Problem
  • Zusammenflussseite
  • Amazon Produktansicht
  • ebay Auflistung
  • BBC News Artikel

Alle geben 404 zurück, imo, weil diese Entwickler den Standard richtig interpretieren, was die Antwort hier und viele andere nicht sind!

jenson-button-event
quelle
1
Ich glaube, die meisten Entwickler definieren "Parameter" als eines der Name / Wert-Paare in einer Abfragezeichenfolge oder einem POST-Textkörper. Eine Github-Repo-Problemanforderung enthält dies nicht.
Kelvin
@ Kelvin wir Entwickler nehmen auch Pfadparameter in die Liste auf. Wenn ein beliebiger URL-Parameter obligatorisch ist, den Speicherort einer Ressource darstellt und nicht enthalten ist, sollte 404 zurückgegeben werden. Dies schließt die requestBody.
Jenson-Button-Event
-6

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.

Francisco Costa
quelle
3
herabgestimmt, da dies eine doppelte Antwort ist. Erwägen Sie, Ihren neuesten Satz als Kommentar zu der älteren Antwort hinzuzufügen, die die Verwendung von 403 anbietet
Benutzer