RESTful API и вызов удаленных методов (RPC)

#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. В дополнение, что, если выполняется несколько полей, пользователь / клиент не должен знать об этом!