Какой код состояния HTTP возвращать, если операция удаления не разрешена по определенной причине

предположим, что у меня есть ресурс (e.g:/api/shipments/100), который поддерживает метод HTTP DELETE. Как вы можете понять из самого URI, если запрос на удаление сделан против этого URI, этот ресурс будет удален.

в моем текущем сценарии запрос на удаление может быть успешно выполнен только при выполнении определенного условия, как показано ниже:

  • если состояние отгрузки не установлено в InTransit или Delivered.

Если есть запрос на удаление против что URI и вышеуказанное условие не выполняются, какой код состояния HTTP будет более правильным для возврата в этом случае? Я думал о нижеприведенных, но не мог решить, какой из них более семантический:

  • 405 Метод Не Допускается
  • 403-запрещено
  • 409 конфликт

2 ответов


Я бы поехал с 409: Conflict, потому что у вас есть нарушение состояния ресурса.

405: Method Not Allowed также будет работать. Если вы хотите использовать 405, вы должны отправить Allow заголовок для указания поддерживаемых методов, а поддерживаемые методы будут отличаться от состояния ресурса. На мой взгляд, этот код ответа хорошо подходит для ресурсов только для чтения, ресурсов, которые нельзя удалить и т. д. но!--14-->Даррелкомментарии к этому post действительны. Спецификация неоднозначна:

метод, указанный в строке запроса, не разрешен для ресурс, идентифицированный запросом-URI. Ответ должен включать: Позвольте заголовок, содержащий список допустимых методов для запрошенного ресурс.

в любом случае вы должны предоставить информацию в теле ответа, чтобы клиент понял источник ошибки.


относительно двух других методов упоминалось:

403: Forbidden следует использовать, когда у вас нет соответствующих привилегий для изменения ресурса, т. е. если вам нужно быть администратором, чтобы удалить этот ресурс, а вы нет.

412: Precondition Failed в основном используется для условных запросов, где предварительные условия явно указаны в заголовках запросов. Например, вы можете иметь условные запросы PUT, которые должны выполняться только при действителен. Если в запросе ничего не указано заголовки, я бы все равно выбрал 409 над 412. Вот спецификация для 412:

предварительное условие, заданное в одном или нескольких полях заголовка запроса оценивается как false при тестировании на сервере. Этот ответ код позволяет клиенту разместить предварительные условия на текущем ресурсе metainformation (данные поля заголовка) и таким образом предотвращает запрошенное метод от применения к ресурсу, отличному от предполагаемого.


Я бы использовал 412: предварительное условие не выполнено.

пожалуйста, смотрите это для кодов состояния HTTP

Коды Состояния Сети