Während die HTTP 1.1 - Spezifikation zu scheint erlauben Nachrichtentexte auf DELETE - Anfragen, so scheint es , um anzuzeigen , dass die Server ignorieren sollten , da es keine definierte Semantik für sie ist.
4.3 Nachrichtentext
Ein Server sollte auf jede Anfrage einen Nachrichtentext lesen und weiterleiten. Wenn die Anforderungsmethode keine definierte Semantik für einen Entitätskörper enthält, MUSS der Nachrichtentext bei der Verarbeitung der Anforderung ignoriert werden.
Ich habe bereits mehrere verwandte Diskussionen zu diesem Thema auf SO und darüber hinaus besprochen, wie zum Beispiel:
- Ist ein Entitätskörper für eine HTTP-DELETE-Anforderung zulässig?
- Nutzdaten von HTTP-Anforderungsmethoden
- HTTP GET mit Anforderungshauptteil
Die meisten Diskussionen scheinen darin übereinzustimmen, dass das Bereitstellen eines Nachrichtentexts auf einem DELETE zulässig ist , dies wird jedoch im Allgemeinen nicht empfohlen.
Außerdem habe ich einen Trend in verschiedenen HTTP-Client-Bibliotheken festgestellt, bei denen immer mehr Verbesserungen für diese Bibliotheken protokolliert werden, um Anforderungskörper auf DELETE zu unterstützen. Die meisten Bibliotheken scheinen sich zu verpflichten, wenn auch gelegentlich mit ein wenig anfänglichem Widerstand.
In meinem Anwendungsfall müssen einige erforderliche Metadaten zu einem DELETE hinzugefügt werden (z. B. der "Grund" für das Löschen sowie einige andere zum Löschen erforderliche Metadaten). Ich habe die folgenden Optionen in Betracht gezogen, von denen keine völlig angemessen erscheint und mit den HTTP-Spezifikationen und / oder REST-Best Practices übereinstimmt:
- Nachrichtentext - Die Spezifikation gibt an, dass Nachrichtentexte in DELETE keinen semantischen Wert haben. von HTTP-Clients nicht vollständig unterstützt; keine Standardpraxis
- Benutzerdefinierte HTTP-Header - Das Erfordernis benutzerdefinierter Header verstößt im Allgemeinen gegen Standardpraktiken . Ihre Verwendung ist nicht mit dem Rest meiner API vereinbar, für die keine benutzerdefinierten Header erforderlich sind. Außerdem ist keine gute HTTP-Antwort verfügbar, um schlechte benutzerdefinierte Header-Werte anzuzeigen (wahrscheinlich eine separate Frage insgesamt).
- Standard-HTTP-Header - Es sind keine Standard-Header geeignet
- Abfrageparameter - Hinzufügen von Abfrage params ändert tatsächlich die Request-URI gelöscht werden; gegen Standardpraktiken
- POST-Methode - (z. B.
POST /resourceToDelete { deletemetadata }
) POST ist keine semantische Option zum Löschen. POST stellt tatsächlich die entgegengesetzte gewünschte Aktion dar (dh POST erstellt Ressourcenuntergebene; ich muss die Ressource jedoch löschen). - Mehrere Methoden - Die Aufteilung der DELETE-Anforderung in zwei Operationen (z. B. PUT-Löschmetadaten, dann DELETE) teilt eine atomare Operation in zwei auf, wodurch möglicherweise ein inkonsistenter Zustand verbleibt. Der Löschgrund (und andere verwandte Metadaten) sind nicht Teil der Ressourcendarstellung selbst.
Meine erste Präferenz wäre wahrscheinlich die Verwendung des Nachrichtentexts nach benutzerdefinierten HTTP-Headern. Wie bereits erwähnt, weisen diese Ansätze jedoch einige Nachteile auf.
Gibt es Empfehlungen oder Best Practices im Einklang mit den REST / HTTP-Standards, um solche erforderlichen Metadaten in DELETE-Anforderungen aufzunehmen? Gibt es andere Alternativen, die ich nicht in Betracht gezogen habe?
Jersey
erlauben keinen Body fürdelete
Anfragen.