Я работаю над небольшой клиент-серверной программой для сбора заказов. Я хочу сделать это "REST (полностью) способом".
Что я хочу сделать:
Соберите все строки заказа (продукт и количество) и отправьте полный заказ на сервер
На данный момент я вижу два варианта сделать это:
- Отправьте каждую строку заказа на сервер: POST qty и product_id
На самом деле я не хочу этого делать, потому что хочу ограничить количество запросов к серверу, поэтому вариант 2:
- Соберите все строки заказов и сразу отправьте их на сервер.
Как реализовать вариант 2? У меня есть пара идей: оберните все строки заказа в объект JSON и отправьте его на сервер или используйте массив для публикации строк заказа.
Является ли реализация варианта 2 хорошей идеей или хорошей практикой, и если да, то как мне это сделать.
Что такое хорошая практика?
/api/book-group
,/api/book-collection
или что-то подобное.Хотя массовые операции (например, пакетное создание) необходимы во многих системах, формально они не рассматриваются в архитектурном стиле RESTful.
Я обнаружил, что POSTing коллекции, как вы предложили, в основном работает, но проблемы возникают, когда вам нужно сообщить об ошибках в ответ на такой запрос. Такие проблемы усугубляются, когда происходит несколько сбоев по разным причинам или когда сервер не поддерживает транзакции. Я предлагаю вам, если нет проблем с производительностью, например, когда поставщик услуг находится в локальной сети (не в глобальной сети) или данные относительно малы, стоит отправить 100 запросов POST на сервер. Будьте проще, начните с отдельных запросов, а если у вас есть проблемы с производительностью, попробуйте оптимизировать.
источник
Facebook объясняет, как это сделать: https://developers.facebook.com/docs/graph-api/making-multiple-requests
источник
Мне ваша идея кажется верной. Реализация - дело ваших предпочтений. Вы можете использовать JSON или просто параметры для этого (массив "order_lines []") и сделать
Поскольку вы собираетесь создать больше ресурсов одновременно в одном действии (порядке и его строках), жизненно важно проверять каждый из них и сохранять их только в том случае, если все они проходят проверку, т.е. вы должны сделать это в транзакции.
источник
Думаю, лучше отправлять отдельные запросы в рамках одного соединения . Конечно, ваш веб-сервер должен это поддерживать.
источник
Я действительно боролся с этим в последнее время, и вот над чем я работаю.
Если POST, который добавляет несколько ресурсов, завершается успешно, верните 200 OK (я рассматривал 201, но пользователь в конечном итоге не попадает на ресурс, который был создан) вместе со страницей, которая отображает все добавленные ресурсы, либо в режиме чтения -только или редактируемый мод. Например, пользователь может выбрать и отправить несколько изображений в галерею, используя форму, содержащую только один входной файл. Если запрос POST завершается успешно, пользователю предоставляется набор форм для каждого созданного представления ресурса изображения, что позволяет ему указать более подробную информацию о каждом (имя, описание и т. Д.).
Если не удается создать один или несколько ресурсов, обработчик POST прерывает всю обработку и добавляет каждое отдельное сообщение об ошибке в массив. Затем возвращается Конфликт 419, и пользователь перенаправляется на страницу ошибки 419 Конфликт, которая представляет содержимое массива ошибок, а также обратный путь к отправленной форме.
источник
Вы не захотите отправлять заголовки HTTP для 100 строк заказа. Вы также не хотите создавать больше запросов, чем необходимо.
Отправьте весь заказ в одном объекте JSON на сервер: server / order или server / order / new. Верните то, что указывает на: server / order / order_id
Также рассмотрите возможность использования
CREATEPUT вместо POSTисточник