Как лучше работать со связанными ресурсами через REST API?

Как бы вы реализовали следующий функционал:
- есть API тороговой площадки, сделано придерживаясь REST подхода, то есть пользователи работают с ресурсами
- есть сущность "комментарий к заказу", совпадает с REST ресурсом "комментарий к заказу".
- есть сущность "заказ". Ресурс "заказ" = сущность "заказ" + поле comments, содержащее массив комментариев к данному заказу
- при любом изменении данных заказа (статус, время доставки итд) должен быть добавлен комментарий

Продавец хочет изменить поле заказа, для этого необходимо совершить действия с двумя ресурсами: обновить поле заказа и создать новый комментарий.
Варианты как это реализовать в API:
1. Два раздельных REST вызова: PATCH /orders/123 и POST /orders/123/comments. Недостаток - нет гарантии того, что оба вызова будут сделаны.
2. Один RPC вызов POST /order/update, который принимает новое значение поля и текст комментария. Недостаток - уходим в сторону от REST

Сталкивались ли вы с похожей задачей?
  • Вопрос задан
  • 2515 просмотров
Пригласить эксперта
Ответы на вопрос 2
pavel_salauyou
@pavel_salauyou
Symfony2 & Angular разработчик
Один RPC вызов POST /order/update, который принимает новое значение поля и текст комментария. Недостаток - уходим в сторону от REST - почему уходим в сторону от REST?
Ответ написан
@Kroz
На мой взгляд здесь происходит смешение ресурсов. Вы хотите атомарно взаимодействовать сразу с несколькими ресурсами, что HTTP не позволяет сделать.

Я бы подумал, зачем Вам вообще нужны комментарии в данном случае? Для описания изменения?

У нас похожая задача решалась бы через версионирование объекта заказа + поле с комментарием последнего изменения в нём. То есть ресурс - это заказ вместе с описанием последнего изменения. Это похоже на внесение изменений на Вики страницу во многих движках, там можно ввести описание того, что было изменено и почему.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы