Имитация действий путем перегрузки POST против встраивания в URI - PullRequest
1 голос
/ 05 января 2011

В настоящее время я читаю Restful Java и Restful Web Services и у меня есть вопрос о стиле REST, в котором эти две книги не согласны.В частности, что делать с изменением состояния ресурса.

В Restful Java есть пример порядка, который можно отменить.Он представляет добавление отмененного = истина к представлению в запросе PUT для передачи состояния.Таким образом, у вас было бы что-то вроде этого.

PUT /orders/333 HTTP/1.1
Content-Type: application/xml

<order id="333">
  <...>
  <cancelled>true</cancelled>
</order>

Затем он предлагает вместо этого сделать это в виде отдельного URI, встроенного в заказ (или в виде ссылки: http-заголовок)Это имело смысл для меня, пока я не прочитал книгу Restful Web Services, которая, кажется, выпадает на сторону публикации отмененного = true в перегруженный POST.

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

Спасибо, выкуп

Ответы [ 2 ]

2 голосов
/ 05 января 2011

«Проблема» с созданием «отмененного» URL заключается в том, что действие по отмене заказа технически не является ресурсом. Это означает, что отмена не является собственным ресурсом - это просто способ изменить существующий ресурс заказа. Если вы хотите быть RESTful, вам следует избегать этого пути и поддерживать PUT со свойством отмененного внутри тела, или вы можете поддерживать частичное обновление с помощью PATCH (хотя этот HTTP-глагол поддерживается менее широко, чем PUT).

Другой вариант - создать ресурс «операция». Эта операция будет определять виды вещей, которые вы можете сделать со своим заказом, например, отмена, дублирование, закрытие и т. д. Но это имеет большой вес и потенциально не требуется, если только вы не начинаете массовые операции. Тогда эта техника довольно мощная, и я нашел единственный способ RESTful моделировать массовые операции.

Конечно, вы всегда можете игнорировать пуристов и сказать, что вам все равно, является ли ваш сервис RESTful. Если все, что вам нужно, это выставить этот глагол с необработанным HTTP-интерфейсом, это ваше дело.

0 голосов
/ 05 января 2011

То, на что похож URI, гораздо менее важно, чем часть rel="Cancel", вот и все, о чем клиент должен заботиться Если вы не хотите, чтобы люди говорили, что вы вводите глаголы в свой URL, просто измените свой URI на

http://example.com/orders/333/cancellor 

или

http://example.com/cancellor?target=/orders/333 

Что касается предложенного альтернативного подхода, лично я не большой поклонник PUT для изменения статуса. Для обновления статуса я люблю отправлять сообщения в отфильтрованную коллекцию состояний.

POST http://example.com/orders/cancelled
<order>...</order> 
...