В то время как HTTP 1.1 spec, похоже, позволяет телам сообщений на 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, а затем DELETE) разделяет атомную операцию на две части, что потенциально оставляет несогласованное состояние. Причина удаления (и другие связанные метаданные) не является частью самого представления ресурса.
Моим первым преимуществом было бы, вероятно, использование тела сообщения, во-вторых, для пользовательских HTTP-заголовков; однако, как указано, есть некоторые недостатки этих подходов.
Существуют ли какие-либо рекомендации или рекомендации в соответствии со стандартами REST/HTTP для включения таких необходимых метаданных в запросы DELETE? Есть ли другие альтернативы, которые я не рассматривал?