REST-API, правильный код состояния HTTP для недействительных DELETE

Я разрабатываю RESTful API, который использует коды состояния и глаголы HTTP в качестве ключевых компонентов при общении.

На религиозном уровне это на стороне ревности RESTafarian.

Правило для определения кодов состояния HTTP было этот график или аналогичные ресурсы.

  • GET /api/documents/1 - 401 Пользователь не выполнил вход
  • GET /api/documents/1 - 200 Пользователь имеет разрешение
  • GET /api/documents/1 - 403 Пользователь не имеет разрешения
  • DELETE /api/documents/1 - 204 У пользователей есть разрешение
  • DELETE /api/documents/1 - 403 Пользователь не имеет разрешения
  • GET /api/documents/2 - 404 Пользовательское разрешение нерелевантно, ресурс не существует
  • DELETE /api/documents/2 - 404 Пользовательское разрешение не имеет значения, ресурс не существует
  • DELETE /api/documents/1 - 404 У пользователей есть разрешение, уже удаленный ресурс
  • DELETE /api/documents/1 - 404 У пользователей нет разрешения, уже удаленный ресурс

Цель:

  • Согласованность использования
  • Не предоставлять частную информацию через ошибки
  • Правильное использование кодов состояния для кэшей клиента или среднего уровня
  • Сбой раньше, продолжайте поиск до минимума

В этой ситуации есть много разных кодов статуса, которые вы выбрали из (404, 403, 410, 405), и в моем случае я пошел с 403 на существующий ресурс, если его не ваш, чтобы не очистить кеш, а 404 на всех несуществующих ресурсах, чтобы сообщить клиентам уничтожить эти данные.

Но мне не нравится переход с 403 на 404 на ресурсы, которые не принадлежат вам.

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

(Многие обсуждения и ответы в REST в Интернете в целом просто "Бросьте 400 плохих запросов, никого не волнует", у меня нет проблем, требующих быстрого исправления или прагматичного взлома.)

Ответ 1

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

401 Несанкционированный

Аналогично 403 Запрещено, но специально для использования когда требуется аутентификация и не удалось или еще не было при условии,.

и

403 Запрещено

Запрос был действительным, но сервер отказывается отвечать на него. В отличие от 401 Несанкционированного ответа, аутентификация не будет иметь никакого значения.

См. также Исправьте код состояния HTTP, когда ресурс доступен, но недоступен из-за разрешений


Я пошел с 403 на существующий ресурс, если его не твой, чтобы не понять кеш и 404 на все несуществующие ресурсы, чтобы клиентов, чтобы стереть эти данные.

Как указывалось ранее, вместо 403 должно использоваться 401. 404 нормально возвращаться, если вы просто хотите сказать "извините, ресурс не найден". Если вы, однако, хотите сказать, что "ресурс был здесь, но он больше не был и больше никогда не будет" (это, похоже, имеет место в вашей ситуации), вы можете вернуть 410:

410 Ушел

Указывает, что запрошенный ресурс больше недоступен и больше не будет доступен. Это следует использовать, когда ресурс был умышленно удален, и ресурс должен быть продувают. После получения кода состояния 410 клиент не должен снова запросите ресурс в будущем. Клиенты, такие как поиск двигатели должны удалить ресурс из своих индексов


Подводя итог, я хотел бы реализовать это в вашем случае. Изменения, которые я сделал, находятся в жирным.

  • GET /api/documents/1 - 401 Пользователь не выполнил вход
  • GET /api/documents/1 - 200 Пользователь имеет разрешение
  • GET /api/documents/1 - 401 Пользователь не имеет разрешения
  • DELETE /api/documents/1 - 204 Пользователь имеет разрешение
  • DELETE /api/documents/1 - 403 Пользователь не имеет разрешения
  • GET /api/documents/2 - 404 Пользовательское разрешение не имеет значения, ресурс не существует
  • DELETE /api/documents/2 - 404 Разрешения пользователя неактуальны, ресурс не существует
  • DELETE /api/documents/1 - 410 Пользователь имеет разрешение, уже удаленный ресурс
  • DELETE /api/documents/1 - 401 Пользователь не имеет разрешения, уже удаленный ресурс

В последнем случае вы можете вернуть 401, если вы не хотите, чтобы неавторизованный пользователь знал, что был уже удаленный ресурс. Если вам все равно, вы можете вернуть 410. Это вам решать.

Мне не нравится переход с 403 на 404 на ресурсы, которые не принадлежат вам.

Совершенно нормально возвращать разные коды состояния в зависимости от ситуации.

Надеюсь, это поможет вам немного.

Ответ 2

Код ответа для недействительного вызова на удаление зависит от того, что происходит с ошибкой. В ваших случаях я бы пошел с:

  • DELETE /api/documents/1 - У пользователей есть разрешение
    • 204 No Content
  • DELETE /api/documents/2 - Недопустимое разрешение пользователей, ресурс не существует
    • 404 Not Found
  • DELETE /api/documents/1 - У пользователей есть разрешение, ресурс уже удален
    • 410 Gone
  • DELETE /api/documents/1 - у пользователей нет разрешения, ресурс уже удален
    • 403 Forbidden

Последний звонок - единственное, о чем стоит поговорить. Я считаю (и ваш график согласен), что у пользователя отсутствует разрешение, приоритет над уже удаляемым ресурсом. Если пользователь должен был получить 410, тогда вы будете пропускать информацию (ресурс уже удален).

Насколько 401/403, 401 есть "вы еще не вошли в систему". 403 - "вы вошли в систему, и у вас нет разрешения делать то, что вы хотите". Я не вижу ничего необычного в использовании этих кодов.

Сказав все это, я чувствую, что я как-то неправильно истолковал вопрос.

Ответ 3

Мне не нравится идея 404 как представление неудавшегося удаления, где ресурс не может быть найден (или для put или patch, если на то пошло). Достаточно часто встречаются проблемы с DNS и для людей, которые имеют проблемы с маршрутизацией на основе параметров, которые будут давать 404, если фактический сайт не может быть найден. Внедрение этого типа двусмысленности может сделать диагностику простых проблем действительно и излишне сложной задачей. Я думаю, что 410 Gone - лучший выбор для представления ресурса, который не найден, когда дело доходит до API.