Какой код состояния HTTP должен возвращать веб-API после успешного завершения, если он выполнял как ОБНОВЛЕНИЯ, так и ВСТАВКИ?
Это дополнительный вопрос к моему предыдущему сообщению в HTTP-глаголе PUT или POST при вызове конечной точки API, которая выполняет UPDATE и INSERT?
У меня есть RESTful Web API (написанный на ASP .Net Core 2.1), который получает "журнал изменений" от клиентского приложения-потребителя. Это класс JSON, содержащий все модификации базы данных, которые были выполнены в клиентском приложении, когда оно работало в автономном режиме. Когда клиентское приложение подключается к сети, оно синхронизирует свою базу данных с оперативной / оперативной базой данных, отправляя API все изменения, произошедшие с момента последней синхронизации. Таким образом, он отправляет API набор изменений / журнал изменений с кучей списков UPDATE, INSERT и DELETE для различных таблиц / объектов.
Что касается API, я на самом деле ничего не удаляю из действующей базы данных - я просто помечаю вещи как удаленные (поэтому я установил для логического поля значение true, то есть delete = true). Технически, API выполняет только INSERTS и UPDATES для базы данных.
Какой код состояния должен возвращать метод действия API после успешного завершения? Так как он выполняет комбинацию как INSERTS, так и UPDATES, должен ли он вернуть 201 Created? Или просто 200 ОК? Или 200 OK, если были выполнены только обновления, или 201, если были выполнены какие-либо вставки? Кроме того, в теле ответа, поскольку я на самом деле не планирую возвращать какие-либо идентификаторы или объекты в теле (так как несколько объектов были бы обновлены и вставлены), я хотел бы вернуть просто обычный текст, сообщающий, сколько объектов было обновлено, как многие были вставлены, и сколько было помечено как удаленное. Это возможно, или даже хорошая идея?
Спасибо
2 ответа
Для меня это не похоже на REST API. Если вы обновляете и создаете несколько ресурсов одновременно через одну конечную точку, это противоречит принципам REST.
Учитывая, что это больше RPC-подобный вызов, я бы вернулся 200 OK
просто указывает на то, что операция прошла успешно.
Тем не менее, есть способ превратить это в нечто более похожее на REST.
Если у вас есть несколько ресурсов, базовые данные в этих ресурсах могут быть объединены и представлены в одном ресурсе, своего рода ресурс "коллекции".
Допустим, этот ресурс размещен на /clientstate/<client-id>
, Делать GET
возвращает весь ресурс clienttate.
Затем, чтобы обновить этот ресурс, вы должны использовать PUT
заменить все состояние клиента. Для клиента совершенно неважно, что к одному ресурсу привязано несколько записей базы данных.
Если вы используете PUT
чтобы заменить все это состояние клиента, тогда соответствующий код ответа должен быть 200 OK
, Или возможно 204 No Content
если ты не вернешь ничего интересного потом.
Я бы посоветовал не пересматривать 207 Multi-Status
,
Кажется, это хорошая ситуация для 207
, определенный в RFC 4918, расширение протокола HTTP:
207
Код состояния (Multi-Status) предоставляет статус для нескольких независимых операций.
Такой документ также гласит следующее:
Ответ о нескольких состояниях передает информацию о нескольких ресурсах в ситуациях, когда может потребоваться несколько кодов состояния. [...]
Хотя
207
используется в качестве общего кода состояния ответа, получатель должен просмотреть содержимое тела ответа о множественном статусе для получения дополнительной информации об успехе или неудаче выполнения метода. Ответ МОЖЕТ быть использован в случае успеха, частичного успеха, а также в ситуациях неудачи.
multistatus
Корневой элемент содержит ноль или болееresponse
элементы в любом порядке, каждый с информацией об отдельном ресурсе. Каждый элемент "ответа" ДОЛЖЕН иметьhref
элемент для идентификации ресурса.[...]