Ist die Bereitstellung von Parametern für eine HTTP-DELETE-Anforderung nicht REST-fähig?
Mein Szenario ist, dass ich das Modell "Sind Sie sicher, dass Sie das löschen möchten?" Szenario. In einigen Fällen deutet der Status der Ressource darauf hin, dass das angeforderte Löschen möglicherweise ungültig ist. Sie können sich wahrscheinlich selbst einige Szenarien vorstellen, in denen eine Bestätigung eines Löschvorgangs erforderlich ist
Die Lösung, die wir gewählt haben, besteht darin, einen Parameter an die Löschanforderung zu übergeben, um anzuzeigen, dass es in Ordnung ist, mit dem Löschen fortzufahren ("? Force_delete = true").
z.B
DELETE http://server/resource/id?force_delete=true
Ich glaube, dass es seitdem immer noch erholsam ist:
(a) Die Semantik von DELETE wird nicht geändert. Der Benutzer kann weiterhin eine normale DELETE-Anforderung senden. Dies kann jedoch bei 409 fehlschlagen, und der Hauptteil der Antwort erklärt, warum. Ich sage, kann fehlschlagen, weil (aus Gründen, die es nicht wert sind, erklärt zu werden) in einigen Fällen kein Grund besteht, den Benutzer dazu aufzufordern.
(b) In Roys Dissertation gibt es keinen Hinweis darauf, dass dies gegen den Geist von REST verstößt. Warum sollte dies der Fall sein, da HTTP nur eine Implementierung von REST ist? Warum sollte die Übergabe von HTTP-Parametern von Bedeutung sein?
Kann mich jemand auf eine endgültige Aussage hinweisen, die den Grund festhält, warum dies nicht RESTful ist?
Wenn der Benutzer bei einer verwandten Frage nicht force_delete angibt, kehre ich zurück. Ist dies der 409 Conflict
am besten geeignete Antwortcode?
Nachverfolgen
Nach einigen weiteren Untersuchungen denke ich, dass das Hinzufügen von Parametern zum DELETE gegen mehrere Prinzipien verstoßen kann.
Das erste ist, dass die Implementierung möglicherweise gegen die "Uniform Interface" verstößt (siehe Abschnitt 5.1.5 von Roys Dissertation
Durch Hinzufügen von 'force_delete' fügen wir der bereits gut definierten DELETE-Methode eine zusätzliche Einschränkung hinzu. Diese Einschränkung ist nur für uns von Bedeutung.
Sie könnten auch argumentieren, dass es gegen den "5.1.2 Client-Server" verstößt, da der Bestätigungsdialog wirklich ein UI-Problem darstellt und wiederum nicht alle Clients das Löschen bestätigen möchten.
Vorschläge jemand?
Antworten:
Nein, es ist nicht RESTful. Der einzige Grund, warum Sie ein Verb (
force_delete
) in den URI einfügen sollten, besteht darin, dass Sie GET / POST-Methoden in einer Umgebung überladen müssten, in der PUT / DELETE-Methoden nicht verfügbar sind. Nach Ihrer Verwendung der DELETE-Methode ist dies nicht der Fall.Der HTTP-Fehlercode
409/Conflict
sollte in Situationen verwendet werden, in denen ein Konflikt vorliegt, der den RESTful-Dienst daran hindert, den Vorgang auszuführen. Es besteht jedoch weiterhin die Möglichkeit, dass der Benutzer den Konflikt möglicherweise selbst lösen kann. Eine Bestätigung vor dem Löschen (wenn es keine echten Konflikte gibt, die das Löschen verhindern würden) ist an sich kein Konflikt, da nichts die API daran hindert, den angeforderten Vorgang auszuführen.Wie Alex sagte (ich weiß nicht, wer ihn herabgestuft hat, er ist korrekt), sollte dies in der Benutzeroberfläche behandelt werden, da ein RESTful-Service als solcher nur Anfragen verarbeitet und daher zustandslos sein sollte (dh er darf sich nicht auf Bestätigungen durch Halten stützen alle serverseitigen Informationen zu einer Anfrage).
Zwei Beispiele dafür sind:
(*) Bitte beachten Sie, dass HTML-Versionen vor 5 die HTTP-Methoden PUT und DELETE nicht nativ unterstützen. Die meisten modernen Browser können diese beiden Methoden jedoch über AJAX-Aufrufe ausführen. In diesem Thread finden Sie Details zur browserübergreifenden Unterstützung.
Update (basierend auf zusätzlichen Untersuchungen und Diskussionen):
Das Szenario, in dem der Dienst das
force_delete=true
Vorhandensein des Flags erfordern würde, verstößt gegen die einheitliche Schnittstelle, wie sie in der Dissertation von Roy Fielding definiert ist. Auch per HTTP RFC , die DELETE - Methode auf dem Ursprungsserver außer Kraft gesetzt werden kann (Client), was bedeutet , dass dies nicht auf dem Zielserver (Service) durchgeführt wird.Sobald der Dienst eine DELETE-Anforderung erhält, sollte er diese verarbeiten, ohne dass eine zusätzliche Bestätigung erforderlich ist (unabhängig davon, ob der Dienst den Vorgang tatsächlich ausführt).
quelle
force_delete=true
? Gemäß HTTP-RFC kann die DELETE-Methode auf dem Ursprungsserver (Client) überschrieben werden, was bedeutet, dass dies nicht auf dem Zielserver (Dienst) erfolgt. Mein Verständnis ist also, dass der Dienst, sobald er eine DELETE-Anforderung erhält, diese ohne Bestätigung verarbeiten sollte (unabhängig davon, ob der Dienst den Vorgang tatsächlich ausführt).Ich denke, das ist nicht erholsam. Ich denke nicht, dass der erholsame Dienst die Anforderung erfüllen sollte, den Benutzer zu zwingen, einen Löschvorgang zu bestätigen. Ich würde dies in der Benutzeroberfläche behandeln.
Ist es sinnvoll, force_delete = true anzugeben, wenn dies die API eines Programms wäre? Wenn jemand ein Skript zum Löschen dieser Ressource schrieb, möchten Sie ihn zwingen, force_delete = true anzugeben, um die Ressource tatsächlich zu löschen?
quelle
Es ist eine alte Frage, aber hier sind einige Kommentare ...
quelle
Zusätzlich zu Alex 'Antwort:
Beachten Sie, dass http: // server / resource / id? Force_delete = true eine andere Ressource als http: // server / resource / id identifiziert . Zum Beispiel ist es ein großer Unterschied, ob Sie / customers /? Status = old oder / customers / löschen.
Jan.
quelle