Службы REST - отображение действий, не связанных с данными

Я понимаю, как использовать REST для выполнения общих взаимодействий с сущностями - использование имен URL-адресов для сопоставления с сущностями и глаголов HTTP для сопоставления с действиями с этими сущностями. Но каков общепринятый взгляд на «действия», больше похожий на RPC?

Например, допустим, я хочу отправить команду на перезагрузку устройства? Здесь нет реальной "сущности", или я делаю что-то вроде POST to http://mydevice/device/reset?


person ctacke    schedule 15.03.2010    source источник


Ответы (3)


/device/reset или /system/reset в порядке.

«Шаблон проектирования» REST действительно побуждает вас НЕ использовать какие-либо глаголы. Вы можете:

POST http://mydevice/system/state    
<stateType>RESET</stateType>

Связанная информация:

person Marcus Leon    schedule 15.03.2010
comment
Да, это возможное решение. - person Jan Algermissen; 15.03.2010

Я не думаю, что нужно использовать POST. «Действие RESET» является идемпотентным действием (если вы вызовете его n раз, вы всегда получите тот же результат), поэтому IMHO вы должны использовать вызов PUT вместо POST (поскольку POST не идемпотентный).

Кроме того, когда вы размещаете ресурс, вы можете использовать

PUT http://system
<device>
  <status>RESET</status>
</device>

or

 PUT http://system/status/reset

Но я думаю, что первый вариант «более спокойный», поскольку вы размещаете ресурс, а второй - просто пользуетесь URL-адресом.

person Diego Dias    schedule 15.03.2010
comment
так вы бы сказали, что PUT - это ОБНОВЛЕНИЕ, а POST - это INSERT (определение IBM вместо Sun)? См. Это: stackoverflow.com / questions / 2447677 / - person ctacke; 15.03.2010
comment
Не совсем. Если вы думаете о CRUD, вы можете использовать эту аналогию, и будет правильным сказать, что если у вас есть INSERT и UPDATE, вы должны использовать POST и PUT соответственно. Но идемпотентность - это нечто большее. Представьте, что есть ресурс, который вы можете вставить в свою БД только один раз и никогда не должны его менять. Это вставка и идемпотентное действие, поэтому я думаю, что в этой ситуации будет использоваться PUT. - person Diego Dias; 15.03.2010
comment
PUT system / status / reset с пустым телом просто обновляет ресурс, чтобы он был пустым. Первый - это правильный способ RESTful. - person Jan Algermissen; 15.03.2010
comment
Кроме того, в отличие от ссылки, которую вы разместили. Такое использование PUT (идемпотентность и загрузка представления ресурса) - это то, что говорит протокол методов Http, на самом деле не очень распространенное использование. en.wikipedia.org/wiki/ - person Diego Dias; 15.03.2010
comment
@Jan Я согласен с тобой. Однако, поскольку я не знаю точного использования WS, я думаю, что это тоже можно использовать. - person Diego Dias; 15.03.2010
comment
Но действительно ли сброс идемпотентен? Если вы сбросите таймер во второй раз, это оставит вас в другой ситуации, чем если бы вы сделали это только в первый раз ... (хотя так же, как когда вы сделали это только во второй раз) - person Jasper; 28.04.2015

Я обычно называю сущность «система» или что-то в этом роде. Итак, вы делаете "/ system / reset". Вы выбрали устройство, и оно тоже работает.

Но да, я обычно считаю эти типы действий обновлениями, в которых используется метод POST. Итак, я думаю, вы правы, отправив POST на / устройство / сброс

person Seaux    schedule 15.03.2010
comment
Забавно, вы должны ввести PUT / POST - я только что спросил об этом: stackoverflow.com/questions/2447677/ - person ctacke; 15.03.2010
comment
Я прокомментирую это, но я также использую вариант REST, поскольку не все клиенты обрабатывают PUT / DELETE. Прочтите страницу википедии о REST: en.wikipedia.org/wiki/Representational_State_Transfer - person Seaux; 15.03.2010
comment
Да, я прочитал статью в Википедии. Поскольку я контролирую как сервис, так и клиентскую часть, у меня есть возможность использовать все 4 глагола. - person ctacke; 15.03.2010