Манипуляция массовой коллекцией через API REST (RESTful)

Мне бы хотелось получить совет по разработке REST API, который позволит клиентам эффективно добавлять/удалять большое количество объектов в коллекцию.

Через API клиенты должны иметь возможность добавлять элементы в коллекцию и удалять из нее элементы, а также манипулировать существующими элементами. Во многих случаях клиент хочет сделать массовые обновления коллекции, например. добавление 1000 предметов и удаление 500 различных предметов. Похоже, клиент должен иметь возможность сделать это за одну транзакцию с сервером, вместо того, чтобы требовать 1000 отдельных запросов POST и 500 DELETE.

Есть ли у кого-нибудь информация о лучших практиках или соглашениях для достижения этого?

Мое настоящее мышление заключается в том, что нужно иметь возможность PUT объект, представляющий изменение в URI коллекции, но это, по-видимому, противоречит HTTP 1.1 RFC, что, по-видимому, предполагает, что данные, отправленные в запросе PUT, должны интерпретироваться независимо от данных, уже присутствующих в URI. Это означает, что клиент должен был бы отправить полное описание нового состояния коллекции за один раз, что может быть намного больше, чем изменение, или даже быть больше, чем клиент будет знать, когда они сделают запрос.

Очевидно, что я был бы рад отклониться от RFC, если это необходимо, но предпочел бы делать это обычным способом, если такое соглашение существует.

Ответ 1

Возможно, вам стоит подумать о задаче изменения как ресурсе. Таким образом, вы действительно используете один объект, который является объектом обновления массовых данных. Возможно, у него есть имя, владелец и большой кадр CSV, XML и т.д., Которые необходимо разобрать и выполнить. В случае CSV вы также можете указать, какие типы объектов представлены в данных CSV.

Список заданий, добавление задания, просмотр состояния задания, обновление задания (возможно, для его запуска/остановки), удаление задания (остановка его при его запуске) и т.д. Эти операции легко отображаются в REST Дизайн API.

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

Это также очень легко поддается реализации фоновой задачи. В этом случае вы, вероятно, захотите добавить поля к отдельным объектам задачи, которые позволяют клиенту API указывать, как они хотят получать уведомление (URL-адрес, который они хотят получить после его завершения, или отправить им электронное письмо и т.д.),.

Ответ 3

Вы должны использовать AtomPub. Он специально разработан для управления коллекциями через HTTP. Там может быть даже реализация для вашего языка выбора.

Ответ 4

Для POST, по крайней мере, кажется, что вы должны иметь возможность POST для URL-адреса списка и иметь тело запроса, содержащего список новых ресурсов вместо одного нового ресурса.

Ответ 5

Насколько я понимаю, REST означает REpresentational State Transfer, поэтому вы должны перенести состояние с клиента на сервер.

Если это означает, что слишком много данных происходит взад и вперед, возможно, вам нужно изменить свое представление. Структура collectionChange будет работать с серией удалений (по id) и добавлениями (со встроенными полными представлениями xml), отправленными на URL-адрес интерфейса обработки. Реализация интерфейса может выбрать собственный метод для удаления и добавления серверной части.

Самая чистая версия, вероятно, заключалась бы в определении элементов по URL-адресу, а коллекция содержала ряд URL-адресов. Новая коллекция может быть PUT после изменений клиентом, а затем серия PUT добавляемых элементов и, возможно, серия удалений, если вы хотите фактически удалить элементы с сервера, а не просто удалить их из этого списка.

Ответ 6

Вы можете ввести мета-представление существующих элементов коллекции, которые не нуждаются в их полном состоянии, поэтому в каком-то абстрактном коде ваше обновление может выглядеть так:

{existing elements 1-100}
{new element foo with values "bar", "baz"}
{existing element 105}
{new element foobar with values "bar", "foo"}
{existing elements 110-200}

Добавление (и изменение) элементов осуществляется путем определения их значений, удаление элементов выполняется, не упоминая его, что новые элементы коллекции и переупорядочения выполняются путем указания нового порядка (если порядок вообще сохраняется).

Таким образом, вы можете легко представить всю новую коллекцию без необходимости повторной передачи всего содержимого. Использование заголовка If-Unmodified-Since гарантирует, что ваша идея контента действительно соответствует идее серверов (чтобы вы случайно не удаляли элементы, о которых вы просто не знали, когда был отправлен запрос).