Подтвердить что ты не робот

Пользовательские действия в службе RESTful

Я читал статьи о сервисах RESTful некоторое время, и я понимаю важность использования VERBS против RESOURCES.

Но я ничего не понимаю. Что произойдет, если нам нужно вызвать определенное действие, которое не является частью CRUD?

Например, подумайте, что я хочу сделать прыжок кошки. Какой формат мы должны использовать?

Является ли следующий RESTful?

http://host/cats/123/jump
4b9b3361

Ответ 1

Если cats/123 представляет ресурс, тогда подумайте об этом так: этот ресурс может иметь много состояний (есть, ходить, спать, прыгать, pissing,...). Когда вы разрабатываете API с использованием архитектурного стиля REST, вы хотите разрешить клиентскому приложению делать разрешенные запросы к ресурсу, который изменит его состояние.

В контексте cats/123 вы можете сделать это с помощью серии запросов POST, которые приведут к изменению состояния ресурса. Воспользовавшись возможностями гипермедиа в REST, вы можете создать процесс, подобный запросам и ответам, показанным ниже. Обратите внимание, что допустимые ссылки изменяются как ответ на POST. Кроме того, клиентское приложение будет кодировать свойства, содержащиеся в массиве Links, а не фактический URI, содержащийся в свойствах HREF.

Запрос:

GET cats/123

Ответ:

{
    "Color" : "black",
    "Age"   : "2",
    "Links":[
    {
        "Food":"kibbles",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Feed the cat"
    },
    {
        "Scare":"yell real loud",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Scare the cat"
    }]
}

Запрос:

POST cats/123

{
    "Food":"kibbles"
}

Ответ:

{
    "Color" : "black",
    "Age"   : "2",
    "Tummy" : "full"
    "Links":[
    {
        "Sleep":"lap",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Pet the cat"
    },
    {
        "Scare":"yell real loud",
        "Method":"POST",
        "Href":"http://cats/123",
        "Title":"Scare the cat"
    }]
}

Ответ 2

для чистого Restful Design я бы порекомендовал что-то вроде:

POST /cats/123/actions

с телом (тип действия определяется в запросе:

{
    "actionType": "jump",
    "customActionParameter": "some value"
}

но это будет излишним. поэтому мне было проще следовать Google Api Design Guide для пользовательских методов:

POST /cats/123:jump

это метод Google использует в нем облачную инфраструктуру Api