#rest #web #architecture
#rest #веб #архитектура
Вопрос:
Итак, я провожу небольшое исследование RESTful API и пытаюсь получить некоторые разъяснения о том, как вызывать методы для ресурсов (по сути, RPC).
Итак, если бы я хотел вызвать метод (отменить) для ресурса (заказа), из того, что я вижу до сих пор, я могу сделать это одним из двух способов:
POST /api/1/orders/123/cancel { }
или
POST /api/1/orders/123 { 'action' : 'cancel' }
Надеюсь, это имеет смысл?
Лично мне больше нравится первый, вы можете просто ввести URL-адрес и вызвать метод, более поздний требует небольшой дополнительной работы с параметрами POST. Любые параметры, требуемые методом, будут помещены в POST?
Я предполагаю, что 3-й — это выполнение:
PATCH /api/1/orders/123 { 'state' : 'cancelled' }
Но я пытаюсь разделить поля и методы заказа (объекта).
Ответ №1:
Лучший вариант — номер четыре, ИСПРАВЬТЕ порядок, установив в поле статуса ресурса значение «отмена»
PATCH /api/1/orders/123 { 'status' : 'cancel' }
или, может быть
PUT /api/1/orders/123/status cancel
Преимущество последнего заключается в том, что его очень легко связать и использовать с html-формой.
Комментарии:
1. Но ‘cancel’ — это глагол (метод), ‘cancelled’ — это соответствующее состояние. Итак, вызов «отмена» изменяет «состояние» на «отменено».
2. Прошу прощения… Я вас не понимаю. Возможно, я недостаточно ясно выразился, ресурс в первом примере исправляется, чтобы для поля «статус» было установлено значение «отмена». Во втором примере ресурс полностью заменяется строкой ‘cancel’.
3. Лично я бы использовал «состояние» вместо «статус» для чего-то подобного… но это совсем другой вопрос. Но в любом случае вы бы не использовали глагол в качестве состояния, вы бы использовали прилагательное типа «отменено».
4. Итак, в терминах OO,
order.cancel()
. Что произойдет, если отмена заказа займет больше времени, чем просто установка состояния заказа на «отменено». При вашем подходе вам нужно будет проверить, какое поле изменяется (в вашем запросе PUT), а затем сопоставить его с соответствующей функцией отмены.5. В дополнение, что, если выполняется несколько полей, пользователь / клиент не должен знать об этом!