Вы, похоже, не создаете RESTful API здесь.API REST используют URI для обозначения ресурсов, а не операций (tell
выглядит для меня как операция).Операции над ресурсами определяются интерфейсом, который является общим для всех ресурсов.Я предполагаю, что вы разрабатываете REST API с использованием HTTP, поэтому ваш общий интерфейс определяется HTTP-глаголами GET, POST, PUT, DELETE и т. Д.
Итак, вместо того, чтобы определять наш сервис с точки зрения операцииtell
, давайте начнем с размышления о ресурсе: собака.Как клиент, давайте предположим, что я ищу собаку Ровера.Моим первым взаимодействием с вашим сервисом может быть запрос, подобный следующему:
GET mysite.com/dogs?q=Rover
В рамках ответа на этот запрос предположим, что мне дан URL-адрес ресурса, представляющего собаку Rover: mysite.com/dogs/3759
Теперь давайте выясним состояние собаки Ровера:
GET mysite.com/dogs/3739
В ответ я вижу, что собака Ровера жива, не спит и стоит (т.е. ответ говорит мне: состояние Ровера пса).Ответ также включает в себя формы, которые я могу использовать, чтобы вызвать переход в состояние этого ресурса (т.е. ответ говорит мне, как сделать состояние изменения Rover).
Теперь, следующий шаг - сказать Rover сделатьчто-то.Мы хотим, чтобы состояние Ровера переходило из положения стоя в положение сидя (предположим, что мы не можем просто обновить состояние Роверса из положения стоя в положении сидя, мы можем только выдать команду, которой Ровер может следовать - как настоящая собака!).Давайте отправим команду sit
в Rover:
POST mysite.com/dogs/3739
<command name="sit"/>
Мы можем думать о команде как о собственном ресурсе - у него есть «имя» (сидеть), эмитент (я), собака(Rover), и за ним также можно следить или не следовать (в зависимости от настроения собаки).Теперь в своем ответе на этот POST я получаю следующую информацию
Status : 201 (Created)
Location: mysite.com/dogs/3739/commands/1299
Статус говорит мне, что эти данные были получены Rover, и это вызвало создание нового ресурса (наша команда).Если мы хотим получить состояние этой команды, мы можем увидеть это, сделав запрос к URL-адресу, указанному в заголовке Location.Давайте сделаем это и узнаем о нашей недавно созданной команде:
GET mysite.com/dogs/3739/commands/1299
Теперь в ответе будет указано состояние этой команды.Давайте предположим, что нам повезло: команда была выполнена (возвращаемое представление для этого ресурса включает некоторую информацию, такую как followed=true
).Ответ также включает в себя ссылку на ресурс, который представляет Rover (собака, которой была дана команда).
Наконец, когда мы запрашиваем состояние ресурса, представляющего Rover:
GET mysite.com/dogs/3739
Из ответа мы видим, что произошел переход состояния, и теперь нам говорят, что Rover 'сидя.Ответ может также включать ссылку на список команд, которые Rover выпускал на сегодняшний день, в виде ссылки на этот URI:
mysite.com/dogs/3739/commands/
Это IMO намного ближе к модели RESTful.Домен, который вы выбрали здесь, может затруднить объяснение и понимание, я думаю.Ресурс «команда» сбивает с толку и звучит очень RPC, но слово «команда» действительно используется только потому, что мы говорим о домашних животных.На самом деле «команда» - это просто сообщение, которое вы посылаете собаке.Когда мы заменяем слово «команда» словом «сообщение», становится легче увидеть, что сообщение - это ресурс, который, безусловно, имеет состояние.
Короче говоря (tl; dr):
- присваивать URI ресурсам, а не операциям
- создавать / обновлять ресурсы (вызывать переходы состояний), отправляя данные (не «вызывая операции»)
- , если возможно, с каждым ответомсвоему клиенту помогите им выполнить следующий переход состояния с помощью ссылок и форм (они позволяют клиенту обновлять свое собственное состояние и обновлять состояние приложения).
Для более подробного чтения есть отличный примеро взаимодействии RESTful, описанном здесь:
http://www.infoq.com/articles/webber-rest-workflow
Этот пример кафе усовершенствован и расширен в книге Джима Уэббера и Яна Робинсона «ОТДЫХ на практике».
Конечно, возможно, стоит перечитать Филдинг (я думаю, наиболее актуальным является раздел 5.2):
http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
Трудно объяснить в одном посте (извините за длину!) но я надеюсь, что это поможет.