ОТДЫХ: еще одна проблема с «действиями» - PullRequest
3 голосов
/ 08 октября 2011

Я все еще пытаюсь обернуть голову в определенных случаях в REST, где использование ресурсов, определяемых имен вместо глаголов , менее интуитивно понятно, чем в простых случаях CRUD.

У меня есть ресурс " Update ", для обновлений / дополнений бэкэнда, с представлением Json следующим образом:

{
  "id": 1,
  "name": "Update Example",      
  "description": "demo update , adds handling of basic arduio type devices",
  "version": "0.0.4",
  "link": 
  {
     "rel": "self",
     "uri": "http://demo.org/updates/1",
     "type: application/json"
  },
 }

EDIT : Немного проясним ситуацию после ответа Даррела Миллера: ресурс коллекции «Обновления» уже существует и работает следующим образом:

  • Внутренняя часть заполняет эту коллекцию на основе списка обновлений, извлеченных (посредством опроса) с внешнего сервера (который не использует rest, описания обновлений там минимальны, и чистого текста)
  • Пользователь, использующий API, не может добавлять обновления, все, что он может сделать, это получить список обновлений и установить / удалить их

Теперь проблема в следующем:

Мне нужно найти правильный, спокойный способ установить обновления через API, и я нашел несколько способов сделать это, но все они кажутся мне "не совсем правильными":


1 - Добавьте ссылку на ресурс обновления, добавьте ресурс Installation и используйте hateoas

Добавьте это к обновлению:

   "link": 
      {
         "rel": "Installation",
         "uri": "http://demo.org/updates/1/installation",
         "type: "application/json"
      }

Установка ресурс:

  {
       "installing": false,
       "installProgress": 0,
       "link": 
       {
         "rel": "self",
         "uri": "http://demo.org/updates/1/installation",
         "type: "application/json"
       }
     }

Чтобы запустить процесс установки, пользователь затем POST до demo.org / updates / 1 / Installation , чтобы обновить "installing": false до "installing": true

Кажется, это будет работать, но стоит ли добавлять «установку» как простой логический атрибут?


2- POST в uri, например demo.org / установки , чтобы добавить новый Установка ресурс

Тем самым запускается процесс установки, а также требуется добавить ссылку на обновление, загружаемое во вновь созданный Установка ресурс:

 {
   "installProgress": 0,
   "link": 
    {
       "rel": "update",
       "uri": "http://demo.org/updates/1",
        "type: application/json"
    },
   }

Хотя это может логически централизовать ресурс Установки в коллекции Установок, мой исходный рефлекс был бы УДАЛИТЬ элемент в этой коллекции, чтобы остановить его установку.

В этом случае, если экземпляр ресурса установки пропал, будет ли использование ссылки «установка» в обновлении заново создавать новый ресурс установки при каждом его «перемещении»?

В целом, не лучше ли было бы иметь атрибут " Установлено " в самом Обновлении , чтобы иметь смысл в целом?

Также, что если пользователь захочет приостановить что-то вроде установки?


Я рассмотрел множество из похожих вопросов в различных статьях и здесь о stackoverflow, но я до сих пор не совсем уверен, что лучший способ решать такие проблемы есть. Кроме того, я знаю, что REST не относится к глаголам (кроме HTTP), но я все еще считаю, что это правильный вопрос.

Так что, пожалуйста, любые отзывы очень приветствуются!

Заранее спасибо.

1 Ответ

4 голосов
/ 08 октября 2011

Как насчет того, чтобы выполнить POST для ресурса коллекции "Updates".Это вернуло бы 202 со ссылкой Location на временный ресурс «Installation».Когда установка завершится, она будет содержать ссылку на развернутый ресурс «update».В какой-то момент вы можете собрать сборщик мусора из ресурсов установки.

Так что для меня интуитивно вы бы добавили обновление в коллекцию обновлений, и если вы хотите просмотреть ранее установленные обновления, вы можете ПОЛУЧИТЬ эту коллекцию.Операции, доступные только во время процесса установки, такие как приостановка и отмена, могут быть доступны в виде ссылок в ресурсе «установка».


Обновление:

Хорошо, так что еслипользователь не может POST to / updates, тогда другой подход заключается в создании ресурса обработки с именем «Installer».

POST /Installer
201 Created
Location: /Installation/345

Термины паузы и отмены - это то, что я использовал бы для rel.Никто не должен дать вам трудное время для этого.Какой URI вы используете для этих ссылок, немного сложнее.Отмена, безусловно, может быть сделано путем удаления ресурса установки.Может быть, вы могли бы сделать паузу, нажав PUT на /installation/345/status.

Для реализации этих дополнительных действий почти наверняка потребуется создание какого-либо другого вида ресурса / подресурса.Все в порядке.По моему мнению, вы никогда не должны стесняться создавать новый ресурс, если это простое решение вашей проблемы.У нас есть только методы HTTP для работы, поэтому моделирование сложного поведения требует от нас творческого подхода с новыми ресурсами.

...