Какой код статуса HTTP для возврата, если операция DELETE не разрешена по определенной причине - программирование
Подтвердить что ты не робот

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

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

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

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

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

  • 405 Метод не разрешен
  • 403 Запрещено
  • 409 Конфликт
4b9b3361

Ответ 1

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

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

Метод, указанный в строке запроса, не разрешен для ресурс, идентифицированный Request-URI. Ответ ДОЛЖЕН включать Разрешить заголовок, содержащий список допустимых методов для запрашиваемого ресурс.

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


В отношении двух других упомянутых методов:

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

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

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