Это сложно.
Я думаю, нам следует;
Возвращать 4xx ошибки только в том случае, если у клиента есть возможность внести изменения в запрос, заголовки или тело, что приведет к успешному выполнению запроса с тем же намерением.
Возвращать коды диапазона ошибок, если ожидаемая мутация не произошла, т.е. не произошло DELETE или PUT ничего не изменил. Однако POST более интересен, потому что в спецификации говорится, что его следует использовать либо для создания ресурсов в новом месте, либо просто для обработки полезной нагрузки.
Используя пример из ответа Виша, если запрос направлен на добавление сотрудника Прии в отдел маркетинга, но Прия не найдена или ее учетная запись заархивирована, то это ошибка приложения.
Запрос работал нормально, он попал в правила вашего приложения, клиент все сделал правильно, ETags совпали и т. Д. И т. Д.
Поскольку мы используем HTTP, мы должны отвечать в зависимости от влияния запроса на состояние ресурса. И это зависит от вашего дизайна API.
Возможно, вы это разработали.
PUT { updated members list } /marketing/members
Возврат кода успеха будет означать, что «замена» ресурса сработала; GET на ресурсе отразит ваши изменения, но этого не произойдет.
Итак, теперь вам нужно выбрать подходящий отрицательный код HTTP, и это сложная часть, поскольку коды строго предназначены для протокола HTTP, а не для вашего приложения.
Когда я читаю официальные коды HTTP, эти два выглядят подходящими.
Код состояния 409 (конфликт) указывает, что запрос не может быть выполнен из-за конфликта с текущим состоянием целевого ресурса. Этот код используется в ситуациях, когда пользователь может разрешить конфликт и повторно отправить запрос. Серверу СЛЕДУЕТ генерировать полезную нагрузку, которая включает в себя достаточно информации, чтобы пользователь мог распознать источник конфликта.
А также
Код состояния 500 (внутренняя ошибка сервера) указывает на то, что сервер обнаружил непредвиденное условие, которое помешало ему выполнить запрос.
Хотя мы традиционно считали, что 500 - это необработанное исключение: - /
Я не считаю неразумным придумывать собственный код статуса, если он последовательно применяется и разрабатывается.
С такой конструкцией легче справиться.
PUT { membership add command } /accounts/groups/memberships/instructions/1739119
Затем вы можете разработать свой API так, чтобы он всегда успешно создавал инструкцию, он возвращает 201 Created и заголовок Location, и любые проблемы с инструкцией удерживаются в этом новом ресурсе.
POST больше похож на последний PUT в новое место. POST разрешает любую обработку сообщения сервером, что открывает дизайн, который говорит что-то вроде «Действие успешно завершилось неудачей».
Вероятно, вы уже написали API, который это делает, веб-сайт. Вы ОТПРАВЛЯЕТЕ платежную форму, и она была успешно отклонена из-за неправильного номера кредитной карты.
При использовании POST, возвращаете ли вы 200 или 201 вместе с сообщением об отклонении, зависит от того, был ли создан новый ресурс и доступен для GET в другом месте или нет.
С учетом всего вышесказанного я был бы склонен разрабатывать API-интерфейсы, которым требуется меньше PUT, возможно, просто обновляя поля данных, а действия и прочее, которые вызывают правила и обработку или просто имеют более высокую вероятность ожидаемых сбоев, могут быть разработаны для POST инструкции форма.
person
Luke Puplett
schedule
23.01.2019