Лучшая практика для задач REST API (не CRUD) - PullRequest
0 голосов
/ 05 августа 2020

Я реализую REST API и надеюсь на ввод методов, которые не полностью соответствуют модели CRUD. Вот общий пример c:

Я ОТПРАВЛЯЮ объект «dog» в свою коллекцию «dogs». ЛАТЯЮ ошейник на новую собаку (собаки / 1). Теперь я хочу, чтобы собака перевернулась.

Предполагая, что «переворачивание» - это разовая задача, которая не меняет состояния собаки, как бы вы это реализовали? У меня есть следующие идеи:

Вариант 1:

POST dogs/1
{
  task: "roll over" 
}

Вариант 2:

POST tasks/
{
  task: "roll over"
  id: 1
}

Вариант 3:

GET dogs/1/rollOver

1 Ответ

1 голос
/ 05 августа 2020

Предполагая, что «переворачивание» - это разовая задача, которая не меняет состояние собаки, как бы вы это реализовали?

Короткий ответ:

POST /tasks

{
    "task": "roll over",
    "id": "/dogs/1"
}

Более длинный ответ: одним из важных ограничений REST является унифицированный интерфейс, который включает тот факт, что семантика самоописательных сообщений одинакова для всех ресурсов повсюду.

GET - это паршивый способ «начать задачу», потому что семантика GET безопасна , то есть фактически только для чтения, что означает, что любой человек в любом месте может запросить представление этого ресурса в любое время. Подумайте о браузерах, предварительно загружающих ссылку на задачу, чтобы сэкономить время, или о веб-сканере, который добавит ваш ресурс задачи для индексации.

Это оставляет выбор между

POST /dogs/1
POST /tasks

Теперь, потому что POST - небезопасный метод, поэтому следует учитывать одну интересную деталь кеширования. Ответ без ошибок на небезопасный запрос сделает недействительным кэшированное представление целевого ресурса.

Обычно, если вы вносите изменение в ресурс (например: PUT / foo), это именно то, что вы хотите.

Но здесь похоже, что задачи «пролистывания» не должны изменять представление /dogs/1. Если представление этого ресурса не изменится, то я не хочу аннулировать его, и вместо этого я нацелен на какой-то другой ресурс с запросом.

Есть, конечно, ничего особо магического c по поводу написания /tasks. Это также может быть /dogs/1/tasks, /tasks/dogs/1, /dogs/1/rollOver или /b79d1e50-44eb-4c51-bfc6-ef0d94c15fdc.

...