Хоча специфікація HTTP 1.1, схоже, дозволяє тілам повідомлень на запити DELETE , схоже, це вказує на те, що сервери повинні ігнорувати це, оскільки для нього немає визначеної семантики.
4.3 Тіло повідомлення
Сервер ПОВИНЕН читати та пересилати тіло повідомлення на будь-який запит; якщо метод запиту не включає визначену семантику для тіла-сутності, то при обробці запиту тіло повідомлення ПОВИННО ігнорувати.
Я вже переглянув кілька суміжних дискусій на цю тему щодо SO та не тільки, таких як:
- Чи дозволяється тілу сутності для запиту HTTP DELETE?
- Корисне навантаження методів запиту HTTP
- HTTP GET з тілом запиту
Більшість дискусій, схоже, сходяться на думці, що надавати тіло повідомлення на DELETE може бути дозволено , але зазвичай не рекомендується.
Крім того, я помітив тенденцію в різних бібліотеках клієнтів HTTP, де все більше і більше вдосконалень, схоже, реєструються для цих бібліотек для підтримки тіл запитів на DELETE. Здається, більшість бібліотек зобов’язують, хоча зрідка і з невеликим початковим опором.
У моєму випадку використання передбачено додавання деяких необхідних метаданих у DELETE (наприклад, "причина" для видалення, разом з деякими іншими метаданими, необхідними для видалення). Я розглянув наступні варіанти, жоден з яких не здається цілком доречним і відповідає специфікаціям HTTP та / або найкращим практикам REST:
- Текст повідомлення - специфікація вказує на те, що тіла повідомлень на DELETE не мають семантичного значення; не повністю підтримується клієнтами HTTP; не стандартна практика
- Спеціальні заголовки HTTP - вимагати спеціальних заголовків, як правило, суперечить стандартній практиці ; їх використання суперечить решті мого API, жоден з яких не вимагає спеціальних заголовків; крім того, немає хорошої відповіді HTTP для вказівки на погані користувацькі значення заголовків (можливо, це взагалі окреме питання)
- Стандартні заголовки HTTP - жодні стандартні заголовки не підходять
- Параметри запиту - додавання параметрів запиту фактично змінює видалений URI-запит; проти стандартної практики
- Метод POST - (наприклад
POST /resourceToDelete { deletemetadata }
) POST не є семантичним варіантом видалення; POST насправді являє собою протилежну бажану дію (тобто POST створює підлеглих ресурсів; але мені потрібно видалити ресурс) - Кілька методів - Розбиття запиту DELETE на дві операції (наприклад, PUT видалити метадані, потім DELETE) розбиває атомну операцію на дві, що може призвести до несумісного стану. Причина видалення (та інші пов’язані метадані) не є частиною самого подання ресурсу.
Моїм першим уподобанням було б, мабуть, використовувати тіло повідомлення, друге - користувацькі заголовки HTTP; однак, як зазначалося, у цих підходів є деякі мінуси.
Чи існують якісь рекомендації чи найкращі практики, що відповідають стандартам REST / HTTP для включення таких необхідних метаданих у запити DELETE? Чи є інші альтернативи, які я не розглядав?
Jersey
не дозволяють тіло дляdelete
запитів.