НЕ 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
.