Какой RESTful HTTP-запрос для выполнения действий на сервере?

У меня есть серверный API RESTFul, который ямы построили Некоторые его части не контролируют ресурсы, и яУ меня возникли проблемы с отображением соответствующего URL + HTTP-метода на действия, выполняемые на сервере.

например Я могу сделать резервную копию каждого ресурса на сервере сPOST /backup, но я'Я не уверен, что это наиболее подходящее отображение. Как насчет одного ресурса? Должен ли я указать это с:POST /backup/id или объявив идентификатор как переменную, которую я отправляю:POST /backup

Пожалуйста, дайте мне несколько советов о том, как структурировать это так, чтобы мой API было легко понять.

 Raymond Saltrelli23 мая 2013 г., 17:31
Вы можете создавать резервные копии различных типов ресурсов или только одного типа? Если используется более одного типа, вам потребуется больше, чем просто Id для создания резервной копии.

Ответы на вопрос(4)

В то время как RESTafarians (пуристы REST) скажут, что единственными действиями в REST API должны быть базовые операции CRUD, которые отображают HTTP-глаголы -,,GETPUTPOST а такжеDELETE- это иногда неЭто практично и делает вашу работу более сложной, чем она должна быть. Если вы хотите иметь другие действия, такие как резервное копирование, вы можете рассмотреть реализацию REST в стиле RPC, которая использует как глагол HTTP, так и имя действия, встроенное в URL запроса, для определения выполняемого действия.

GET    /resource/select
GET    /resource/select?id={id}
PUT    /resource/update?id={id}
POST   /resource/insert
DELETE /resource/delete?id={id}
PUT*   /resource/backup?id={id}
GET    /resource/backup?id={id}

* Если ваше приложение поддерживает несколько резервных копий ресурсов, и вы хотите, чтобы действие «Резервное копирование» всегда создавало новую резервную копию, тогда ее обычно используют.POST в качестве бэкапа не идемпотент. Если вы поддерживаете только одну резервную копию, а действие «Резервное копирование» просто сбрасывает резервную копию ресурса, то вам следует использовать PUT, поскольку в этом случае резервное копирование является идемпотентным.

 Darrel Miller23 мая 2013 г., 20:34
Реальные пуристы REST совершенно непреклонны в том, что вам следует избегать попыток соотнести единый интерфейс HTTP и CRUD.

Вы могли бы использоватьPOST /backups?resource=car&id=123 для резервного копированияавтомобиль сID = 123 (конечно, вы можете передать объект JSON вместо параметров в URL, если хотите). Обратите внимание также на множественное число врезервное копирование, Это'Это деталь, но она лучше отражает тот факт, что одна или несколько резервных копий могут быть найдены под этим URI.

Если вы хотите заменить ранее созданную резервную копию, то, как уже упоминалось, вы можете использовать PUT, возможно, такPUT /backups/456?resource=car&id=123который говорит "замените резервную копию с id = 456 той, которую вы создадите из резервной копии автомобиля с id = 123 ".

Наконец, если вы хотите сделать резервную копию всех своих ресурсов за один шаг, у вас может быть соответствующий параметр, такой какPOST /backups?all=true или похожие. И если вы хотите, чтобы эти резервные копии заменяли предыдущие, перед запуском вы можете их использовать.DELETE /backups

я верюPOST /backup (для резервного копирования всех ресурсов) иPOST /backup  (для резервного копирования одного ресурса) здесь вам подойдет лучше всего.

CRUD MAPPING: Как сказал Рэй, резервное копирование нехорошо сопоставить с CRUD; Вы хотите, чтобы ресурс действия на сервере выполнял эту функцию. Марк Массе написал O 'Рейли книга по дизайну REST API а такжеего рекомендация в этом случае использовать ресурс действия на сервере (см. слайд 20, посвященный архетипу действия).

ОБОЗНАЧЕНИЕ URI: Ресурсы действия должны быть последним сегментом URI без дочерних ресурсов. Это будет иметь смысл, когда вы увидите причину, по которой метод HTTP лучше всего подходит здесь.

HTTP-метод: Резервное копирование не должнобытьидемпотент действие, поэтому вы хотите метод HTTP, которыйне идемпотент. ЭтоPOST. Мало того, что PUT идемпотент, URI, который вы указываете, где вы 'выкладываете ресурсповторная отправка. Ты неЯ не хочу этого делать, если хочешь быть спокойным. Частью цели POST и ее неидемпотентности являетсяуказанный как

предоставление блока данных, такого как результат отправки формы, процессу обработки данных

чего ты хочешь здесь

ОСТАЛЬНОЕ: Чтобы быть многоуровневой системой, сервер (посредством своего ресурса действия (метод резервного копирования)) должен указывать, куда должны идти его выходные данные; клиент не должента логика.

Таким образом, делая это таким образом, ваш ресурс действий резервного копирования может свободно определять, куда вы хотите поместить резервные копии (который может быть ресурсом хранилища (/backups); увидетьслайд 19) и хотите ли вы перезаписать предыдущие резервные копии или хотите реализовать какую-либо форму управления версиями (то, что дизайн REST не делает)т). В общем, вы были на правильном пути!

 Jacob Stevens16 мая 2014 г., 00:52
Спасибо, обновлено. Это'Теперь все в GitHub.
 Tyler Collier15 мая 2014 г., 00:52
Мне понравился твой ответ ноhis recommendation ссылка устарела; Это'не работает (404). Можете ли вы обновить свой ответ?
Решение Вопроса

Это зависит от того, создаете ли вы новый объект резервной копии в базе данных при каждом вызове, или если у вас есть много объектов резервных копий (например, резервных копий для разных файлов), которые содержат только последнее значение.

POST /backups используется для создания нового объекта, и поэтому правильный ответ, если вы всегда создаете новую резервную копию.

PUT /backups/id если вы обновляете свои резервные данные в том же объекте.

 Jacob Stevens04 июн. 2013 г., 04:03
Кажется, Никлас / резервный ресурс является ресурсом действия ("Я могу сделать резервную копию каждого ресурса ... с 'POST / backup '....»). Если это так, используяPOST / резервные копии (множественное число) делает цель немного двусмысленной.Марк Масс рекомендует ресурсы действия должны быть глаголами (резервная копия), а ресурсы коллекции - множественным числом (резервные копии). Эта семантика неЭто пока стандартизировано, но полезно рассмотреть.
 fotanus04 июн. 2013 г., 04:44
@JacobStevens То, что вы говорите, правда, и это очень интересная дискуссия, но я могуСоветую следовать не стандартизированной семантике, потому что стандарты несколько хаотичны, и во многих случаях, когда их присваивается более одного, в конечном итоге никто не был принят повсеместно, и мы упускаем точку в стандарте. Сейчас я считаю, что лучше научиться использовать REST с существительными и внимательно следить за изменениями.

Ваш ответ на вопрос