Welchen Http-Code soll ich für "Thing not found" zurückgeben?

7

Ich baue einen Web-Service, der in diesem speziellen Fall nach Informationen über einen Benutzer fragt.

Nehmen wir an, dass der Nachschlag-Web-Treffer aus Gründen der Argumentation lautet:

%Vor%

Wenn der Benutzer gefunden wird, gebe ich den Code 200 zurück:

%Vor%

Wenn Sie weglassen oder eine Kontonummer angeben, die keine Nummer ist, gebe ich 400 zurück. Zum Beispiel die folgenden schlechten Anfragen:

%Vor%

alle geben den Fehler 400 (schlechte Anfrage) zurück, z.B.:

%Vor%

Ich möchte einen Statuscode für Benutzer nicht gefunden erhalten, der als HTTP-Statuscode zurückgegeben wird. Zum Beispiel:

%Vor%

Ich habe darüber nachgedacht, 404 (nicht gefunden) , die ist eine gültige Antwort (die angeforderte Ressource wurde, wirklich und wahr, nicht gefunden.) Aber ich Ich habe Angst, dass Leute, die es debuggen, denken könnten, dass es bedeutet, dass sie /patrons/ falsch geschrieben haben.

Kann jemand an einen anderen http-Status-Code denken, den ich verwenden könnte?

Update: Ich bin auffällig

%Vor%

Was sagst du dazu?

Vergessen Sie nicht, dass nicht alle HTTP-Server HTML-Inhalte bereitstellen. Wenn ein IIS-Webserver nach einer Ressource gefragt wird:

%Vor%

Dann muss der HTTP-Server entscheiden, worauf er antworten soll. Auf den meisten Webservern entspricht eine Ressource namens /MyStartPage.html einer Datei auf der Festplatte.

Während StackOverflow:

%Vor%

Wenn die Ressource nicht existiert, sollte der Webserver (zu Recht) 404 zurückgeben.

    
Ian Boyd 22.06.2009, 13:47
quelle

9 Antworten

17

404 Not Found ist die richtige Antwort, wenn es ein Service ist, wird es nicht wirklich von Menschen benutzt, sondern von Maschinen, und deshalb sollten Tippfehler nicht Ihre erste Sorge sein.

Außerdem gibt es sehr wenig, was Sie tun können, um dem menschlichen Verhalten überhaupt zu begegnen (wenn Sie eine Sache denken, wenn es wirklich eine andere ist). Wenn Sie einen kleinen Fehler msg als Teil des Fehlercodes zurückgeben, sollte alles funktionieren. Sie könnten ihnen sogar eine mögliche Lösung vorschlagen.

Eine 500 zurückzugeben, wenn die Anwendung genau das tut, was sie entwickelt hat, erscheint auch ein bisschen seltsam. 404 beschreibt genau die Situation: Ressource nicht gefunden.

    
cgp 22.06.2009, 13:51
quelle
7

Ich denke, Sie sollten 404 verwenden. Entwickler der API werden verstehen, was 404 bedeutet und werden daher ihren eigenen üblichen Debugging-Prozess folgen, um das Problem zu lösen. Bleiben Sie beim Protokoll.

    
JamesC 22.06.2009 13:55
quelle
6

Fehler 404 ist in diesem Fall tatsächlich eine akzeptablere Antwort, da die Ressource wirklich nicht gefunden wird. Sie könnten immer ein benutzerdefiniertes Fehlerdokument haben, das erklärt, dass die Benutzer-ID nicht gefunden wird.

Ein 400-Fehler bedeutet, dass der Client eine fehlerhafte Syntax gesendet hat, was in Ihrem Beispiel nicht der Fall ist. Daher sollten Sie diesen Fehlercode nicht verwenden. Es kann scheinen, dass "Ungültige Anfrage" korrekt ist, aber was dies tatsächlich bedeutet, ist ein Fehler in der Anfrage-Header-Syntax.

Dies ist auch kein 500 Fehler, weil kein Fehler aufgetreten ist. Es gibt kein Problem damit, dass der Webserver die Anfrage erfüllt. Tatsache ist, dass die Anfrage eine Ressource sucht, die nicht vorhanden ist.

404 ist die einzige geeignete Antwort, es sei denn, Sie möchten es als eine vollständig gültige Anfrage betrachten, geben Sie den Status 200 zurück und eine Seite, die erklärt, dass der angeforderte Benutzer nicht existiert.

Von meinem ursprünglichen Kommentar zu der Frage:

  

Ich glaube nicht, dass auch ein 200-stufiger Fehler angemessen wäre, bedenke die Erklärungen bei W3 w3. org / Protokolle / rfc2616 / rfc2616-sec10.html

    
defines 22.06.2009 13:55
quelle
5

IMHO, die HTTP-Antwort ist nicht der richtige Ort, um dies zu behandeln, da der Fehler nicht auf der HTTP-Ebene ist. Es ist auf Anwendungsebene. Eine mögliche Lösung besteht darin, das Null-Objekt-Muster zu verwenden, um eine Null "Benutzer" zurückzugeben, die der Patron-Schnittstelle entspricht, aber angibt dass keine solche Person existiert.

UPDATE: Ich bin davon überzeugt, dass diese Antwort falsch ist. Ich möchte es jedoch weglassen, da es sich um eine potenziell gültige Antwort handelt (abhängig von Details, die in der Frage nicht aufgeführt sind), und ich denke, dass die Kommentare lehrreich sind.

    
Harper Shelby 22.06.2009 13:51
quelle
2

Wenn Ihr Dienst normalerweise einen Fehler entdeckt, den er nicht verarbeiten kann, aber die Anfrage ist gut formuliert, dann würde ich denken, dass Sie einen 500-Statuscode zurückgeben möchten.

Auch ein weiterer Grund, warum ich sage 500 wäre angemessen, ist, dass aus meiner Erfahrung in .NET Web Services, immer wenn ich eine Ausnahme über die Leitung (wie eine RecordNotFound Ausnahme) werfen, der Webserver und Client immer interpretiert haben Antwort auf einen 500 Statuscode.

Wie auch immer, es wäre eine gute Idee, diese Liste von http-Statuscodes zu überprüfen und Schön die, die Ihren Bedürfnissen am besten entspricht.

    
Joseph 22.06.2009 13:52
quelle
1

Es hängt davon ab, welche Art von Webservice Sie erstellen.

SOAP- und XML-Webdienste geben normalerweise 200 OK zurück, wenn ein angefordertes Objekt (Benutzer) nicht gefunden werden kann, und geben den Fehlertyp / die Nachricht / Beschreibung in das Antwortdokument ein. Sie trennen eine Transportebene (HTTP) von den ausgetauschten Nachrichten (XML). Ein 404-Fehler (der sich auf der Transportebene befindet) wird nur zurückgegeben, wenn Sie einen nicht vorhandenen API-Endpunkt (falsche URL) anfordern.

Mit einem REST-Webservice verwenden Sie jedoch HTTP-Methoden und Status direkt für den Nachrichtenaustausch. REST verwendet verschiedene HTTP-Methoden (GET / POST / PUT / DELETE), um anzugeben, welche Aktion gewünscht wird und der Server den Status als HTTP-Status zurückgibt. Im Falle eines REST-Webservice wäre 404 der richtige HTTP-Status, wenn ein Benutzer nicht gefunden werden konnte.

500 ist auf jeden Fall unpassend, da 5xx bedeutet, dass auf der Serverseite etwas nicht stimmt (was nicht der Fall ist), während 4xx Fehler bedeuten, dass auf der Client-Seite etwas nicht stimmt.

    
Zargony 22.06.2009 14:19
quelle
1

Es kann 4 Jahre alt sein, aber es ist immer noch ziemlich relevant. Für APIs, die sowohl von borwsers als auch von nativen Apps verwendet werden sollen, ist es viel einfacher, die HTTP-Codes für die Statusanzeige zu verwenden. Und wenn nötig, verwenden Sie ein paar zusätzliche Codes aus den nicht zugewiesenen für Bedingungen, die nicht gut zu bestehenden HTTP-Codes passen.

    
tazmanos 05.11.2013 14:31
quelle
0

Fehler auf Web-Service-Ebene sollten nicht einfach eine einfache HTTP-Statuszeile zurückgeben, sondern sollten Inhalte in einem gültigen und dokumentierten Format zurückgeben, das vom Client analysiert werden kann, der auf Ihren Service zugreift. Das zurückgegebene Dokument sollte einen Fehlercode enthalten, der Teil eines dokumentierten Codesatzes für Ihren Webservice ist, sowie eine kurze Beschreibung des Problems und optional eine detailliertere Beschreibung des Problems.

    
Lars Haugseth 22.06.2009 14:12
quelle
0

Wenn Sie die Antworten des Web-Service über HTTP-Antwortcodes steuern möchten, können Sie in der Tat eine 404 verwenden, um diese Bedingung anzuzeigen.

Ich denke jedoch, dass es natürlicher ist, die Antwort des Web-Service vollständig im Text der HTTP-Antwort zu definieren und 200 für eine erfolgreiche Kommunikation zurückzugeben ("Ich habe Ihre Anfrage verstanden und Ihnen eine angemessene Antwort geschickt"). . In diesem Fall würden Sie 200 wie üblich mit der Nutzlast Ihrer Anfrage (XML oder JSON oder was auch immer) zurückgeben, um anzuzeigen, dass keine übereinstimmende Entität gefunden wurde

Ich würde nicht-200 Fehlercodes berücksichtigen, die Ausnahmen in herkömmlichen Programmiersprachen ähneln, und der HTTP-Antwortkörper ähnelt eher dem Rückkehrcode. Stellen Sie sich vor, Sie würden dies konventionell implementieren - würden Sie eine Ausnahme auslösen, wenn keine Entität gefunden wurde, oder null zurückgeben? Angesichts der fragilen Natur von Netzwerkverbindungen möchte ich natürlich alle HTTP-Level-Fehlercodes für Probleme bei der Kommunikation reservieren, und ich würde lieber immer 200 OK vom Dienst selbst zurückgeben, zusammen mit einer Payload, die das Ergebnis angibt oder jeder Service-Level-Fehler.

    
Andrzej Doyle 22.06.2009 14:51
quelle

Tags und Links