Разработка RESTful API для создания ресурса и связанных с ним ресурсов одновременно - PullRequest
0 голосов
/ 25 октября 2019

Я хочу знать, как спроектировать API RESTFUL для одновременного создания ресурса и связанных с ним ресурсов.

Например, я хочу создать заказ, содержащий список элементов, используя мой RESTFUL API,например:

{
    order_id:1,
    description: "XXX",
    items: [
        {item_id:1, price:30, ...},
        {item_id:2, price:40, ...}
    ]
}

Один способ - дать два api

  1. post: api/orders => создать новый заказ и вернуть идентификатор заказа
  2. post: api/orders/id/items => создать связанные элементы с помощью идентификатора заказа

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

Итак, это хороший способ поместить элементы в тело запроса? и опубликовать только один раз на api/orders? Или есть другой лучший дизайн для этой ситуации?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Определенно, создание заказа без предметов - плохая идея. Это в конечном итоге приведет к нестабильному API и непоследовательным объектам. Кроме того, вы не можете создавать элементы, используя api/orders URI, поскольку это нарушает основу принципов REST.

Для вашей бизнес-логики REST API может выглядеть следующим образом:

POST api/item
  {
    price: 40,
    name: "xxx",
    ...
  }
<<<<< 201
  {
    id: 1
  }

GET api/item/{id}
<<<<< 200
  {
    id: 4,
    price: 40,
    name: "xxx",
    ...
  }

POST api/order
  {
    description: "xxx",
    items: [
      {id: 1, count: 5},
      {id: 23456, count: 1}
    ]
  }
<<<<< 201
  {
    id: 123442
  }

Я думаю, что нет необходимости помещать полные элементы в создание тела запроса заказа. Идентификаторов элементов будет достаточно для создания привязок элементов заказа на бэкенде.

1 голос
/ 25 октября 2019

Я хочу знать, как создать RESTFUL API для одновременного создания ресурса и связанных с ним ресурсов.

Совершенно разумная вещь, которую нужно сделать. Сконцентрируйте свое внимание на том, как описать клиенту, как создать соответствующий запрос, и как интерпретировать документ, описывающий результат.

Подсказка в определении кода состояния 201 Создан

Код состояния 201 (Создан) указывает, что запрос был выполнен и привел к созданию одного или нескольких новых ресурсов . Полезная нагрузка 201, как правило, описывает и ссылается на созданный (ые) ресурс (ы).

(выделение добавлено)

В случае Интернета мы могли бы сделать это следующим образом:иметь форму;клиент предоставит информацию в форме и отправит ее. Браузер, следуя стандарту обработки форм, генерирует запрос POST (поскольку семантика небезопасна) с данными формы, закодированными в теле сообщения, и соответствующим типом содержимого, определенным в заголовке (например, application/x-www-form-urlencoded).

Ответ, в терминах, будет HTML-документ с кучей ссылок на все интересные ресурсы, которые были созданы.

Должен ли это быть HTML? Нет, конечно нет - вы можете использовать text/plain, если это соответствует вашим потребностям. У вас есть несколько лучшие долгосрочные перспективы, когда вы используете медиа-тип, в который встроено понятие ссылок, понятное компонентам общего назначения.

...