Какой код состояния 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