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

#rest #http-status-codes

#rest #http-status-codes

Вопрос:

Я создаю REST API на PHP.

Когда клиент может попытаться выполнить действие, которое недоступно, например, он пытается изменить свойство ресурса, которое невозможно передать: например, пытается изменить значение свойства «country» на «Julius Caesar»:

  1. Какой код состояния HTTP я должен отправить обратно с ответом? Я размышляю между 403 и 409 .
  2. Я не знаю, 403 Forbidden связано ли это только с пользовательскими разрешениями или я могу использовать для этой цели?
  3. В какой ситуации я должен использовать 409 Conflict ?
  4. Подводя итог, каков надлежащий статус HTTP-ответа на незаконную операцию?

Комментарии:

1. Я думаю, что код должен быть 403, между ними есть небольшая разница, посмотрите здесь: ссылка

2. Подойдет ли здесь значение 405? Пользователь использует запрос POST / PUT для обновления значения, доступного только для чтения.

Ответ №1:

Я думаю, вам следует использовать 403 Forbidden здесь.

Из спецификации HTTP:

Сервер понял запрос, но отказывается его выполнять. Авторизация не поможет, и запрос НЕ СЛЕДУЕТ повторять. (…)

Поскольку вы отказываетесь изменять значение «country», это код состояния, который вы хотите вернуть. Клиент не авторизован для изменения страны ресурса.

Конфликт 409 в данном случае не уместен. Статус 409 должен использоваться, когда, например, кто-то отправляет запрос на обновление ресурса, но его версия ресурса устарела, потому что ресурс был изменен за это время. Другими словами, существует конфликт между данными клиента и данными на сервере. Это не имеет ничего общего с разрешением изменять определенные свойства ресурса.

Запрос не удалось завершить из-за конфликта с текущим состоянием ресурса. Этот код разрешен только в ситуациях, когда ожидается, что пользователь сможет разрешить конфликт и повторно отправить запрос. Тело ответа ДОЛЖНО содержать достаточно информации, чтобы пользователь мог распознать источник конфликта. В идеале объект ответа должен содержать достаточно информации для пользователя или пользовательского агента, чтобы устранить проблему; однако это может быть невозможно и не требуется.

Конфликты, скорее всего, возникают в ответ на запрос PUT. Например, если использовалось управление версиями и передаваемый объект включал изменения в ресурс, которые конфликтуют с изменениями, внесенными более ранним запросом (сторонним), сервер может использовать ответ 409, чтобы указать, что он не может выполнить запрос. В этом случае объект ответа, скорее всего, будет содержать список различий между двумя версиями в формате, определяемом типом содержимого ответа.

(выделено мной)

Ответ №2:

В этой ситуации я обычно выбираю 400 Bad Request . Я не уверен, что более конкретный код состояния диапазона 400 подойдет лучше, однако я бы не использовал 403. Для меня 403 связан с безопасностью и не должен использоваться для ошибок проверки полезной нагрузки запроса.

Что касается 409 Conflict , я обычно использую это, если запрос действителен, но изменение состояния каким-то образом незаконно. Однако я видел, как он использовался и в других контекстах.

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

Комментарии:

1. «403 связан с безопасностью» => Может быть нет: здесь и здесь

2. 400 означает неверно сформированный запрос, не правильно сформированные, но недопустимые значения. Попробуйте 422