RESTful - Was sollte ein DELETE-Antworttext enthalten?

76

Angenommen, ich habe eine API, über die Sie Benutzer erhalten können:

GET /RESTAPI/user/

Und Sie können Benutzer löschen durch:

DELETE /RESTAPI/user/123

Was ist die RESTful-Konvention darüber, was der Antwortkörper des DELETE enthalten sollte? Ich habe erwartet, dass es die neue Liste aller Benutzer sein sollte, die jetzt nicht mehr den Benutzer mit der ID 123 enthält.

Das Googeln brachte mir keine befriedigenden Antworten. Ich habe nur Meinungen dazu gefunden, aber gibt es keine strenge Definition von RESTful Services ?

Dies ist KEIN Duplikat von Was sollte ein RESTful API POST / DELETE im Body zurückgeben? und Welche REST PUT / POST / DELETE-Aufrufe sollten durch eine Konvention zurückgegeben werden? da diese Frage nach einer strengen Definition in Bezug auf LÖSCHEN fragt. Diese Fragen wurden nur durch lose Meinungen beantwortet.

tmuecksch
quelle

Antworten:

77

Der Grund, warum Sie keine harten Antworten erhalten, ist, dass es keinen harten RESTful-Standard gibt. Daher kann ich nur vorschlagen, dass Sie einen harten Standard erstellen und ihn in Ihren eigenen APIs einhalten

Ich habe dies als Leitfaden für RESTful-Services verwendet. Http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

Es heißt, antworte mit einem 204-Status und einem leeren Körper

Ich halte mich an diese Standards und dokumentiere sie gut für alle, die meine APIs verwenden möchten

Leon
quelle
3
Tatsächlich ist REST eine Reihe von Einschränkungen. Es gibt eine einheitliche Schnittstellenbeschränkung, die besagt, dass Sie Standards verwenden müssen, um den Server vom Client zu entkoppeln. Dies können der HTTP-Standard, der URI-Standard, MIME-Typen, Hypermedia, RDF-Vokabeln usw. sein. Sie können auswählen, welcher Standard verwendet werden soll. Es gibt keine
strengen
17

Was ist die RESTful-Konvention darüber, was das DELETEAntwortgremium enthalten sollte?

REST ist ein Architekturstil, der von Fielding in Kapitel 5 seiner Dissertation definiert wurde und eine Reihe von Einschränkungen für Anwendungen beschreibt, die mit dieser Architektur erstellt wurden. REST ist protokollunabhängig konzipiert, aber in Kapitel 6 derselben Dissertation wird beschrieben, wie REST über HTTP angewendet wird.

Sobald Ihre REST-Anwendung über dem HTTP-Protokoll erstellt wurde, sollten Sie die HTTP-Semantik kennen. Die Semantik des HTTP / 1.1-Protokolls ist derzeit im RFC 7231 beschrieben .


Die Antwortnutzlast einer DELETEAnforderung, die erfolgreich war, kann:

  • Sei leer oder;
  • Fügen Sie eine Darstellung des Status der Aktion hinzu.

Die folgenden Antwortstatuscodes eignen sich für eine erfolgreiche DELETEAnfrage:

  • 202: Die Anforderung wurde zur Verarbeitung angenommen, die Verarbeitung wurde jedoch nicht abgeschlossen.
  • 204: Der Server hat die Anforderung erfolgreich erfüllt und es ist kein zusätzlicher Inhalt im Antwortnutzdatenkörper zu senden.
  • 200: Die Anforderung war erfolgreich und die Anforderungsnutzlast enthält eine Darstellung des Status der Aktion.

Siehe das folgende Zitat aus dem RFC 7231 :

Wenn eine DELETEMethode erfolgreich angewendet wurde, MUSS der Ursprungsserver einen 202(akzeptierten) Statuscode senden, wenn die Aktion wahrscheinlich erfolgreich ist, aber noch nicht ausgeführt wurde, einen 204(kein Inhalt) Statuscode, wenn die Aktion ausgeführt wurde und keine weiteren Informationen vorliegen angegeben werden oder einen 200(OK) Statuscode, wenn die Aktion ausgeführt wurde und die Antwortnachricht eine Darstellung enthält, die den Status beschreibt.

Cassiomolin
quelle
Eine konkretere Verbindung zu RFC wäre tools.ietf.org/html/rfc7231#section-4.3.5 :)
Dmitriy Popov
16

204 No Contentist eine beliebte Antwort für DELETEund gelegentlich PUTauch.

Wenn Sie jedoch HATEOAS implementieren, ist es 200 OKmöglicherweise idealer , ein mit folgenden Links zurückzugeben. Dies liegt daran, dass eine HATEOAS REST-API dem Client Kontext bereitstellt. Stellen Sie sich den Speicherort vor, zu dem eine Benutzeranwendung navigiert, nachdem ein Löschbefehl erfolgreich ausgegeben wurde. Hier ist ein kurzer Artikelauszug mit mehr Diskussion darüber. Weitere Informationen finden Sie im Blog-Artikel.

Vermeiden Sie 204 Antworten, wenn Sie eine HATEOAS-Anwendung erstellen.

Dies ist eine Lektion über das REST-API-Design, die ich beim Erstellen nicht trivialer REST-APIs gelernt habe. Um den Client so gut wie möglich zu unterstützen, sollte eine REST-API keine 204 (kein Inhalt) Antworten zurückgeben.

Aus Sicht des Dienstes kann eine Antwort 204 (kein Inhalt) eine vollkommen gültige Antwort auf eine POST-, PUT- oder DELETE-Anforderung sein. Insbesondere für eine DELETE-Anfrage erscheint dies sehr angemessen, denn was können Sie noch sagen?

Aus der Sicht eines richtigen HATEOAS-fähigen Clients ist eine 204-Antwort jedoch problematisch, da keine Links zu folgen sind. Wenn Hypermedia als Engine für den Anwendungsstatus fungiert und keine Links vorhanden sind, gibt es keinen Status. Mit anderen Worten, eine Antwort 204 wirft den gesamten Anwendungsstatus weg.

Dieser Artikel behandelt POST, PUT, DELETEund GET. Hier ist die spezifische Diskussion über DELETE:

Antworten auf DELETE-Anfragen

Eine DELETE-Anforderung repräsentiert die Absicht, eine Ressource zu löschen. Wenn der Dienst eine DELETE-Anforderung erfolgreich verarbeitet, was kann er dann tun, als eine 204 (kein Inhalt) zurückzugeben? Immerhin wurde die Ressource gerade entfernt.

Eine Ressource ist häufig Mitglied einer Sammlung oder gehört auf andere Weise einem Container. Beispielsweise stellt http://foo.ploeh.dk/api/tags/rock ein "Rock" -Tag dar. Eine andere Sichtweise ist jedoch, dass die / rock-Ressource im Tag-Container enthalten ist (der selbst ein ist) Ressource). Dies sollte den Benutzern von Atom Pub bekannt sein.

Stellen Sie sich vor, Sie möchten die Ressource http://foo.ploeh.dk/api/tags/rock löschen . Um dieses Ziel zu erreichen, stellen Sie eine DELETE-Anfrage dagegen. Wenn Ihr Kunde nur einen 204 (kein Inhalt) zurückerhält, hat er nur seinen Kontext verloren. Wo geht es von dort aus? Wenn Sie den Status des Clients nicht beibehalten, wissen Sie nicht, woher Sie kamen.

Anstatt 204 (kein Inhalt) zurückzugeben, sollte die API hilfreich sein und Orte vorschlagen, an die Sie gehen können. In diesem Beispiel ist meiner Meinung nach ein offensichtlicher Link zu http://foo.ploeh.dk/api/tags - dem Container, aus dem der Client gerade eine Ressource gelöscht hat. Vielleicht möchte der Kunde mehr Ressourcen löschen, das wäre also ein hilfreicher Link.

Grokify
quelle
Die Frage zu DELETEund HATEOAS hängt wirklich davon ab, wie jemand HATEOAS implementieren möchte. Wenn bei der HATEOAS-Implementierung der Server Verbindungsbeziehungen zurückgibt, die in den Nachrichtentext eingebettet sind (z. B. HAL oder json-ld ), ist dies 204 No contentmöglicherweise nicht der koschere Statuscode. Wenn die HATEOAS-Implementierung jedoch die Server-Return-Link-Beziehungen in Antwort-Headern (dh Web-Linking ) enthält, 204 No contentist dies vollkommen koscher.
RAM