RESTful способ создания нескольких элементов в одном запросе

Я работаю над небольшой клиентской программой для сбора заказов. Я хочу сделать это в режиме «REST (полный)».

Я хочу сделать следующее:

Соберите все строки заказа (продукт и количество) и отправьте полный заказ на сервер

На данный момент я вижу два варианта:

  1. Отправьте каждую строку заказа на сервер: POST qty и product_id

На самом деле я не хочу этого делать, потому что хочу ограничить количество запросов на сервер, поэтому вариант 2:

  1. Соберите все строки заказа и сразу же отправьте их на сервер.

Как мне реализовать вариант 2? несколько идей, которые у меня есть: оберните все строки заказа в объекте JSON и отправьте это на сервер или используйте массив для размещения строк заказа.

Это хорошая идея или хорошая практика для реализации варианта 2, и если да, то как мне это сделать.

Что такое хорошая практика?

Я считаю, что другой правильный способ приблизиться к этому – создать другой ресурс, который представляет вашу коллекцию ресурсов. Например, представьте, что у нас есть конечная точка, такая как /api/sheep/{id} и мы можем POST to /api/sheep создать ресурс овец.

Теперь, если мы хотим поддерживать массовое создание, мы должны рассмотреть новый ресурс flock в /api/flock (или /api/-collection если вам не хватает более значимого имени). Помните, что ресурсам не нужно сопоставлять ваши базы данных или модели приложений . Это распространенное заблуждение.

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

Я думаю, что можно с уверенностью предположить, что работа с ресурсом может также означать создание нескольких других объектов в качестве побочного эффекта.

Хотя массовые операции (например, пакетное создание) важны во многих системах, они формально не учитываются в стиле архитектуры RESTful.

Я обнаружил, что POSTing коллекция, как вы предложили, в основном работает, но проблемы возникают, когда вам нужно сообщать о сбоях в ответ на такой запрос. Такие проблемы хуже, когда возникают многочисленные сбои по разным причинам или когда сервер не поддерживает транзакции. Мое предложение для вас состоит в том, что если нет проблем с производительностью, например, когда поставщик услуг находится в локальной сети (а не WAN) или данные относительно невелики, стоит отправить 100 запросов POST на сервер. Держите его простым, начинайте с отдельных запросов, и если у вас проблема с производительностью, попробуйте оптимизировать.

Facebook объясняет, как это сделать: https://developers.facebook.com/docs/graph-api/making-multiple-requests

Простые пакетные запросы

Пакетный API принимает массив логических HTTP-запросов, представленных как массивы JSON – каждый запрос имеет метод (соответствующий HTTP-методу GET / PUT / POST / DELETE и т. Д.), Relative_url (часть URL-адреса после graph.facebook. com), дополнительный массив заголовков (соответствующий HTTP-заголовкам) и необязательный элемент (для запросов POST и PUT). Пакетный API возвращает массив логических HTTP-ответов, представленных в виде массивов JSON – каждый ответ имеет код состояния, дополнительный массив заголовков и необязательный элемент (который является строкой, кодированной JSON).

Ваша идея кажется действительной для меня. Реализация – вопрос ваших предпочтений. Вы можете использовать JSON или просто параметры для этого («order_lines []» массив) и делать

 POST /orders 

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

Я думаю, что лучше отправлять отдельные запросы в одном соединении . Конечно, ваш веб-сервер должен его поддерживать

В последнее время я борется с этим, и вот что я делаю.

Если POST, добавляющий несколько ресурсов, преуспевает, верните 200 OK (я рассматривал 201, но пользователь в конечном итоге не приземляется на созданном ресурсе) вместе со страницей, на которой отображаются все ресурсы, которые были добавлены либо в read – только или редактируемая мода. Например, пользователь может выбирать и POST несколько изображений в галерею, используя форму, содержащую только один входной файл. Если запрос POST полностью завершен, пользователю предоставляется набор форм для каждого представления ресурса изображения, который позволяет им указывать более подробную информацию о каждом (имя, описание и т. Д.).

В случае невозможности создания одного или нескольких ресурсов обработчик POST прерывает всю обработку и добавляет каждое отдельное сообщение об ошибке в массив. Затем возвращается 419 конфликт, и пользователь перенаправляется на страницу ошибки 419 Conflict, которая представляет содержимое массива ошибок, а также путь обратно в форму, которая была отправлена.

Вы не захотите отправлять HTTP-заголовки на 100 строк заказа. Вы не хотите генерировать больше запросов, чем необходимо.

Отправьте весь заказ в одном объекте JSON на сервер, чтобы: сервер / заказ или сервер / заказ / новый. Верните то, что указывает на: server / order / order_id

Также рассмотрите возможность использования CREATE PUT вместо POST

Давайте будем гением компьютера.