RESTful одиночный ресурс - PullRequest
       7

RESTful одиночный ресурс

10 голосов
/ 08 декабря 2011

Я из мира RPC, но в настоящее время выясняю, является ли использование REST хорошей идеей для моего проекта.Насколько я понимаю из Википедии , основная идея сервисов RESTful состоит в предоставлении доступа к коллекциям и их отдельным элементам.

В моем случае сервер был бы измерительным прибором.Я должен иметь возможность запускать, останавливать и приостанавливать процедуру измерения и считывать данные в любое время.

В настоящее время я рассматриваю следующее:

  • POST / measure (начать измерение, это продолжается до тех пор, пока пользователь не остановит)
  • PUT / measure pause = true / false (пауза / отмена)
  • УДАЛИТЬ / измерить (остановить)
  • ПОЛУЧИТЬ / измерить (получить данные измерений)

Однако я не уверен, подходит ли этомодель REST, так как я на самом деле не работаю с коллекциями или элементами здесь.

Мой вопрос: как бы я получил доступ к одноэлементному ресурсу и чтобы запросы на запуск / остановку к серверу нарушали ограничение RESTful без сохранения состояния?

Ответы [ 3 ]

10 голосов
/ 26 февраля 2015

НЕ RESTful

Нет, ваш подход не является RESTful, потому что, если я пойму рабочий процесс, вы удалите ресурс, чтобы остановить измерение, а затем получите ресурс для считывания окончательного результата. Но удаление ресурса подразумевает, что ничего не останется GET.

Тот факт, что ваш ресурс является синглтоном, не является проблемой вообще. Проблема заключается в том, как вы отображаете глаголы и состояния.

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

Глаголы

Теперь давайте рассмотрим ваши глаголы.

GET возвращает представление ресурса. Поэтому, когда вы GET /measure, он должен вернуть некоторые данные, которые представляют текущее измерение.

PUT создает или обновляет определенный именованный ресурс. Ресурс назван по его URL. Таким образом, PUT /measure подразумевает, что вы обновляете состояние ресурса с именем /measure или создаете этот ресурс, если он еще не существует. В вашем случае значение инструмента доступно только для чтения: мы не можем записать значение в радианах / с в инструмент. Но приостановленное / активное состояние инструмента является изменяемым, поэтому PUT /measure должно включать тело, которое изменяет состояние инструмента. Здесь вы можете использовать много разных представлений, но одним простым подходом будет тело запроса, например active=true или active=false, чтобы указать, каким должно быть новое состояние инструмента.

POST аналогично PUT, за исключением того, что клиент не указывает имя ресурса, который должен быть создан или обновлен. Например, в другом API клиент может POST /articles создать новую статью. Сервер создаст ресурс и даст ему имя типа /articles/1234, а затем сообщит клиенту об этом новом имени, вернув HTTP-код 201 CREATED и добавив заголовок Location: /articles/1234, чтобы сообщить клиенту, где находится новый ресурс. , В вашем сценарии POST не является значимым глаголом, потому что вы всегда знаете, как называется ваш одноэлементный ресурс.

DELETE означает, что вы удаляете ресурс, а поскольку ресурс идентифицируется по URL, DELETE /measure означает, что /measure больше не существует. Последующее GET /measure должно вернуть либо 404 NOT FOUND, либо 410 GONE. В вашем случае клиент на самом деле не может уничтожить инструмент, поэтому DELETE не имеет смысла значимого глагола.

Заключение

Таким образом, в итоге RESTful-дизайн для вашей службы должен иметь PUT /measure с телом запроса, который сообщает инструменту, должен ли он быть активным или неактивным (приостановленным), и GET /measure для чтения текущего измерения. Если вы GET /measure на приостановленном инструменте, вам, вероятно, следует вернуть 409 CONFLICT HTTP-статус. Ваша служба вообще не должна использовать POST или DELETE.

1 голос
/ 08 декабря 2011

Опираясь на последний ответ.Вот как вы можете захотеть разбить его на

  • measure / - ПОЛУЧИТЬ все такты из инструмента (Paginate / limit при необходимости на основе параметров запроса)
  • measure /: measure_id- ПОЛУЧИТЬ определенную меру
  • меры / - POST - Запускает новую меру.Это возвращает новый идентификатор меры, с которым вы можете иметь дело позже.
  • measure /: measure_id - DELETE - остановить измерение.
  • measure /: measure_id - PUT - обновить показатель
  • measure / last_measure - последний измеренный ресурс.
1 голос
/ 08 декабря 2011

Вы все еще работаете с ресурсом, и то, как вы его сломали, звучит хорошо для меня.Поля явно упоминают временные службы в главе REST :

Ключевой абстракцией информации в REST является ресурс.Любая информация, которая может быть названа, может быть ресурсом: документ или изображение, временная служба (например, «сегодняшняя погода в Лос-Анджелесе»)

Возможно, имеет смысл присвоить каждому измерению уникальный идентификаторхоть.Таким образом, вы можете однозначно ссылаться на каждое измерение (вам даже не нужно сохранять старые измерения, но если кто-то ссылается на старое измерение, вы можете сказать им, что то, что они запрашивают, больше не актуально).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...