Какой ресурс я должен использовать, чтобы сохранить мой API RESTFul?
Я создаю API, чтобы позволить клиенту API отправлять уведомления, чтобы напомнить пользователю обновить статус заказа. Пока есть два уведомления:
- когда пользователь не пометил заказ как полученный;
- когда пользователь не пометил заказ как выполненный.
Я хочу создать этот API, чтобы упростить его распространение на другие уведомления, связанные с заказом, но сохранить простой URI для клиентов этого API. Как я могу определить свои ресурсы, чтобы сохранить мой API RESTFul?
Я думал о том, чтобы иметь одну из этих структур:
Вариант 1:
POST: /api/ordernotification/receive/{id}
POST: /api/ordernotification/complete/{id}
Вариант 2 (пропустите статус ресурса и опубликуйте его):
POST: /api/ordernotification/?id={id}&statusID={statusID}
РЕДАКТИРОВАТЬ
Вариант 2.1 (сохранение сочлененного URI, как предложено @Jazimov):
POST: /api/ordernotification/{statusID}/{id}.
Какой вариант больше подходит? Есть ли какое-то преимущество у одного варианта над другим? Или есть другой вариант, о котором я не подумал?
3 ответа
Я хотел бы пойти с чем-то по этим направлениям
POST /api/order/1234/notifications/not-received
POST /api/order/1234/notifications/not-completed
К которым позже можно получить доступ через
GET /api/order/1234/notifications/not-received
GET /api/order/1234/notifications/not-completed
Или же
GET /api/order/1234/notification/8899
Нет никакого реального ограничения семантически богатого URI, так что вы также можете воспользоваться этим и быть явным.
Если я вас правильно понимаю, у вас есть два типа ordernotifications
: для уведомления receive
и те, для уведомления complete
, Если это две отдельные модели данных, то я думаю, что их вложение - хорошая идея (т. Е. Таблица с именем ReceiveOrderNotification
а также CompleteOrderNotification
). Если это так, то вы можете полностью раскрыть две разные конечные точки, такие как POST /api/receiveordernotification
а также POST /api/completeordernotification
,
Но я не думаю, что это лучшее, что вы можете сделать, учитывая, что между уведомлениями о заказах, вероятно, есть много общего. Теперь вариант 2 больше похож на GET
, так как вы используете параметры запроса, поэтому с вашей первой опцией давайте свернем их в это:
POST: /api/ordernotification/
а затем передать ему некоторые данные JSON для создания уведомлений
{
"orderId": "orderId",
"userId": "userId",
"prompt": "not marked received/not marked done"
}
Я также удалил /{id}
потому что когда ты POST
Обычно вы создаете новую вещь, а идентификатор еще не создан. Даже если клиент создает id
и отправляя его в API, рекомендуется оставить его открытым, чтобы ваш API мог по-своему создавать новый уникальный ресурс.
Это RESTful, потому что POST
создает ресурс ordernotification
с определенными точками данных. Ваш первый вариант сделал действия ресурсом самим по себе, но он, вероятно, не представлен ни в одной модели данных в вашем бэкэнде. Чтобы быть максимально RESTful, ваши конечные точки API должны представлять домены базы данных (таблицы, коллекции и т. Д.). Затем вы позволяете своим контроллерам выбирать, какие методы обслуживания использовать, учитывая данные, отправленные в запросе. В противном случае конечные точки REST раскрывают всю логику заранее и становятся длинным списком не поддерживаемых конечных точек.
Я думаю, чтобы обновить статус уже вставленных записей, ваша конечная точка должна быть PUT вместо POST.
Ты можешь использовать
PUT: /api/ordernotification/:id/status/
с данными клиентов JSON
{
"status": "your_status"
}
согласно данным запроса, конечная точка должна обновить запись.