#rest #http-status-codes
#rest #http-status-codes
Вопрос:
Я создаю REST API на PHP.
Когда клиент может попытаться выполнить действие, которое недоступно, например, он пытается изменить свойство ресурса, которое невозможно передать: например, пытается изменить значение свойства «country» на «Julius Caesar»:
- Какой код состояния HTTP я должен отправить обратно с ответом? Я размышляю между
403
и409
. - Я не знаю,
403 Forbidden
связано ли это только с пользовательскими разрешениями или я могу использовать для этой цели? - В какой ситуации я должен использовать
409 Conflict
? - Подводя итог, каков надлежащий статус HTTP-ответа на незаконную операцию?
Комментарии:
1. Я думаю, что код должен быть 403, между ними есть небольшая разница, посмотрите здесь: ссылка
2. Подойдет ли здесь значение 405? Пользователь использует запрос POST / PUT для обновления значения, доступного только для чтения.
Ответ №1:
Я думаю, вам следует использовать 403 Forbidden здесь.
Сервер понял запрос, но отказывается его выполнять. Авторизация не поможет, и запрос НЕ СЛЕДУЕТ повторять. (…)
Поскольку вы отказываетесь изменять значение «country», это код состояния, который вы хотите вернуть. Клиент не авторизован для изменения страны ресурса.
Конфликт 409 в данном случае не уместен. Статус 409 должен использоваться, когда, например, кто-то отправляет запрос на обновление ресурса, но его версия ресурса устарела, потому что ресурс был изменен за это время. Другими словами, существует конфликт между данными клиента и данными на сервере. Это не имеет ничего общего с разрешением изменять определенные свойства ресурса.
Запрос не удалось завершить из-за конфликта с текущим состоянием ресурса. Этот код разрешен только в ситуациях, когда ожидается, что пользователь сможет разрешить конфликт и повторно отправить запрос. Тело ответа ДОЛЖНО содержать достаточно информации, чтобы пользователь мог распознать источник конфликта. В идеале объект ответа должен содержать достаточно информации для пользователя или пользовательского агента, чтобы устранить проблему; однако это может быть невозможно и не требуется.
Конфликты, скорее всего, возникают в ответ на запрос PUT. Например, если использовалось управление версиями и передаваемый объект включал изменения в ресурс, которые конфликтуют с изменениями, внесенными более ранним запросом (сторонним), сервер может использовать ответ 409, чтобы указать, что он не может выполнить запрос. В этом случае объект ответа, скорее всего, будет содержать список различий между двумя версиями в формате, определяемом типом содержимого ответа.
(выделено мной)
Ответ №2:
В этой ситуации я обычно выбираю 400 Bad Request
. Я не уверен, что более конкретный код состояния диапазона 400 подойдет лучше, однако я бы не использовал 403. Для меня 403 связан с безопасностью и не должен использоваться для ошибок проверки полезной нагрузки запроса.
Что касается 409 Conflict
, я обычно использую это, если запрос действителен, но изменение состояния каким-то образом незаконно. Однако я видел, как он использовался и в других контекстах.
В конце концов, пока вы согласованы во всем своем API (и документируете значение возвращаемых кодов состояния), у вас есть некоторая гибкость в выборе того, как вы хотите выразить ошибку.
Комментарии:
1. «403 связан с безопасностью» => Может быть нет: здесь и здесь
2. 400 означает неверно сформированный запрос, не правильно сформированные, но недопустимые значения. Попробуйте 422