Da HTTP-Anforderungen in einem zustandslosen System unabhängig sein sollten, sollten die Ergebnisse einer Anforderung nicht von einer vorherigen Anforderung abhängig sein. Überlegen Sie, was passieren soll, wenn zwei Benutzer gleichzeitig ein DELETE für dieselbe Ressource ausführen. Es ist sinnvoll, dass die zweite Anforderung eine 404 erhält. Dasselbe sollte zutreffen, wenn ein Benutzer zwei Anforderungen stellt.
Ich vermute, dass es für Sie nicht idempotent ist, wenn DELETE zwei verschiedene Antworten zurückgibt. Ich finde es nützlich, sich idempotente Anfragen so vorzustellen, dass das System im selben Zustand bleibt und nicht unbedingt dieselbe Antwort hat. Unabhängig davon, ob Sie eine vorhandene Ressource LÖSCHEN oder versuchen, eine nicht vorhandene Ressource zu LÖSCHEN, ist der Serverressourcenstatus derselbe.
rm
.rm
Gibt einen Fehler zurück, wenn er nicht vorhanden ist. tools.ietf.org/html/rfc7231#section-4.3.5Das RESTful-Webdienst-Kochbuch ist hierfür eine hervorragende Ressource. Zufällig zeigt die Google-Vorschau die Seite über LÖSCHEN (Seite 11):
quelle
Ich stimme dem zu, was die aktuell gewählte Antwort gesagt hat, dass die 2. (und 3., 4., ...) LÖSCHEN eine 404 bekommen sollte . Und ich habe festgestellt, dass die Antwort 143 Stimmen hat, aber auch einen entgegengesetzten Kommentar, der 54 Stimmen hat, so dass die Community in zwei Lager im Verhältnis 3: 1 aufgeteilt ist. Hier finden Sie weitere Informationen zur Beilegung dieser langjährigen Debatte.
Beginnen wir zunächst NICHT mit dem, was "ich" denke, was "Sie" denken oder was noch ein anderer Buchautor denkt. Beginnen wir mit den HTTP-Spezifikationen, dh RFC 7231.
DELETE /some/resource/which/does/not/exist
zu einer 404 führen sollte. DannDELETE /some/resource/which/happened/to/be/removed/by/someone/else/five/days/ago
könnte genauso gut auch eine 404 zurückgegeben werden Warum sollte esDELETE /some/resource/i/deleted/five/seconds/ago
dann anders sein? "Aber wie wäre es mit Idempotenz?!", Kann ich hören, dass du das schreist. Moment mal, wir werden gleich darauf eingehen.In der Vergangenheit war RFC 2616, veröffentlicht 1999, die am häufigsten referenzierte HTTP 1.1-Spezifikation. Leider war die Beschreibung der Idempotenz vage , was Raum für all diese Debatten lässt. Diese Spezifikation wurde jedoch durch RFC 7231 ersetzt. Zitiert aus RFC 7231, Abschnitt 4.2.2 Idempotente Methoden , Hervorhebung von mir:
Es steht also in den Spezifikationen geschrieben, dass es bei der Idempotenz nur um die Auswirkungen auf den Server geht. Das erste LÖSCHEN, das ein 204 zurückgibt, und das nachfolgende LÖSCHEN, das 404 zurückgibt, macht ein derart unterschiedlicher Statuscode das LÖSCHEN NICHT nicht idempotent. Die Verwendung dieses Arguments zur Rechtfertigung einer nachfolgenden Rückgabe ist einfach irrelevant.
OK, es geht also nicht um Idempotenz. Aber dann könnte eine Folgefrage sein, was ist, wenn wir uns immer noch dafür entscheiden, 204 in nachfolgendem LÖSCHEN zu verwenden? Ist es o.k?
Gute Frage. Die Motivation ist verständlich: Dem Kunden zu ermöglichen, sein beabsichtigtes Ergebnis zu erreichen, ohne sich um die Fehlerbehandlung sorgen zu müssen. Ich würde sagen, 204 in nachfolgendem DELETE zurückzugeben, ist eine weitgehend harmlose serverseitige "Notlüge", die die Clientseite nicht sofort erkennen wird. Deshalb machen ~ 25% der Leute das in freier Wildbahn und es scheint immer noch zu funktionieren. Denken Sie daran, dass eine solche Lüge als semantisch seltsam angesehen werden kann, da sie
GET /non-exist
404 zurückgibt, aberDELETE /non-exist
204 ergibt. Zu diesem Zeitpunkt würde der Kunde herausfinden, dass Ihr Service nicht vollständig mit Abschnitt 6.5.4 übereinstimmt. 404 Nicht gefunden .Ich möchte jedoch darauf hinweisen, dass der von RFC 7231 angedeutete beabsichtigte Weg, dh die Rückgabe von 404 bei nachfolgendem LÖSCHEN, überhaupt kein Problem sein sollte. 3x mehr Entwickler haben sich dafür entschieden, und haben Sie jemals einen größeren Vorfall oder eine Beschwerde gehört, die von einem Kunden verursacht wurde, der 404 nicht verarbeiten konnte? Vermutlich nein, und das liegt daran, dass jeder anständige Client, der HTTP DELETE (oder eine andere HTTP-Methode) implementiert, nicht blind davon ausgehen würde, dass das Ergebnis immer 2xx erfolgreich sein würde. Sobald der Entwickler über die Fehlerbehandlung nachdenkt, ist 404 Not Found einer der ersten Fehler, die in den Sinn kommen. Zu diesem Zeitpunkt würde er / sie wahrscheinlich die Schlussfolgerung ziehen, dass es für eine HTTP-DELETE-Operation semantisch sicher ist, einen 404-Fehler zu ignorieren. Und sie haben es getan.
Problem gelöst.
quelle
Erstes LÖSCHEN : 200 oder 204.
Nachfolgende LÖSCHEN : 200 oder 204.
Begründung : DELETE sollte idempotent sein. Wenn Sie bei einem zweiten LÖSCHEN 404 zurückgeben, ändert sich Ihre Antwort von einem Erfolgscode in einen Fehlercode . Das Client-Programm kann unter der Annahme, dass das LÖSCHEN fehlgeschlagen ist, falsche Aktionen ausführen.
Beispiel :
Um die Verwendung dieses Ansatzes zu veranschaulichen, enthält der HTTP-API-Styleguide für PayPal die folgende Richtlinie:
quelle