RESTful способ отправки команд - PullRequest
49 голосов
/ 12 августа 2010

Как вы отправляете «команды» на сервер RESTful?

Вариант использования: мой сервер кэширует определенную информацию, чтобы ему не приходилось читать базу данных каждый раз, когда запрашивается эта информация. Мне нужен способ отправить команду из моего клиентского приложения, чтобы сказать серверу очистить кеш. Вы бы использовали POST или PUT на каком-то URL-адресе, например ".../flush_cache"?

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

Ответы [ 3 ]

70 голосов
/ 11 апреля 2011

Я часто сталкивался с такой ситуацией в прошлом проекте.Поскольку REST - это хорошо ... о ресурсах, не всегда понятно, как обращаться с вещами, которые действительно RPC по своей природе.

Простой способ обойти это - думать о нем как о бюрократическая часть отдыха , запросом может быть сам ресурс:

1.«Вы хотите запустить команду на моем сервере? Сначала заполните эту форму I90292 и отправьте ее нам»:

POST /bureaucracy/command-request 
Content-Type: application/x-www-form-urlencoded
Content-Length: ...

"Хорошо, посмотрим, что мы можем сделать. Ваш номер дела - 999"

201 Создано (или 202 Принято согласно комментарию Кугеля) Местоположение / бюрократия / команда-запрос / 999

А затем клиент регулярно проверяет

GET / бюрократия / команда-запрос / 999

Надеюсь, он получит ответ, подобныйследующий

200 OK
<command-request>
  <number>999</number>
  ...
  <result>Success</result>
</command-request>

Конечно, если бюрократическая служба пользуется большим вниманием клиентов, она предложит клиенту позвонить ему, когда это будет сделано, если он захочет:
"Вы хотите запустить команду на нашем сервере?Пожалуйста, заполните эту форму и отправьте ее нам. Обратите внимание, что вы можете присоединиться к своей контактной информации, чтобы мы могли позвонить вам, когда это будет сделано "

POST /bureaucracy/command-request?callback=client.com/bureaucracy/inbox 

Или как пользовательский заголовок http X-Callback: http://client.com/bureaucracy/inbox

15 голосов
/ 12 августа 2010

Я бы предложил это:

  • Создайте ресурс, который вы можете ПОЛУЧИТЬ, который сообщит вам клиенту, как отправить команду, подобно HTML-форме, используя POST, если у этой команды есть побочные эффекты.
  • POST к ресурсу для запуска команды и возврата URI к новому ресурсу, который вы создаете во время выполнения этого запроса POST (например, http://server.example/results/00001), возможно, с состоянием 204 (без содержимого) и заголовком Location или перенаправлением (в зависимости от того, какой клиент может понять).
  • Пусть клиент проверит результаты на этом ресурсе, используя GET. Вы также можете вернуть представление для этого ресурса (или чего-то подобного) как сущность, возвращенную POST непосредственно перед этим.

Вам решать, каков жизненный цикл ресурса результатов. Это может быть недолгим, если вам не нужно хранить результаты долго. URI может быть создан, например, из UUID.

5 голосов
/ 27 июля 2014

В вашем случае, почему бы не сделать ресурс cache?

DELETE /cache

Когда вы хотите сбросить это.

POST /cache

когда вы хотите создать новый.

Или объединить два предыдущих в следующее:

DELETE /cache?autorecreate=true
...