Я знаю, что REST предназначен, чтобы быть ориентированным на ресурс, который примерно переводит в операции CRUD на этих ресурсах с помощью стандартных методов HTTP. Но что я просто хотел обновить часть ресурса?
Например, скажем, я имею Payment
ресурс и я хотели отметить свое состояние как"paid
". Я не хочу POST
целое Payment
объект через HTTP (иногда у меня даже нет всех данных).
Каков был бы УСПОКОИТЕЛЬНЫЙ способ сделать это? Я видел, что Twitter использует следующий подход для обновления состояний Twitter:
http://api.twitter.com/1/statuses/update.xml?status=playing with cURL and the Twitter API
Этот подход в "духе" REST?
ОБНОВЛЕНИЕ: ПОМЕЩЕННЫЙ-> СООБЩЕНИЕ
Некоторые ссылки я нашел тем временем:
Идеальный способ сделать это - изменить часть (подресурс) ресурса и заставить сервер вернуть 303 См. другое с заголовком Location, чтобы указать на измененный ресурс. 303 See Other сообщает клиенту, что в результате запроса изменился какой-то другой ресурс и что клиент должен обновить свое представление.
В вашем примере (типы носителей, конечно, гипотетические):
1. Client retrieves payment representation GET /payments/2 200 Ok Content-Type: application/payment+xml <payment> <status href="/payments/2/status" value="pending"/> </payment> 2. Client updates status PUT /payments/2/status Content-Type: text/plain payed 303 See Other Location: /payments/2 3. Client follows the 303 redirect GET /payments/2 200 Ok Content-Type: application/payment+xml <payment> <status href="/payments/2/status" value="payed"/> </payment>
POST следует использовать для изменения ресурса
EDIT: Статья Мартина Фаулера Richardson Maturity Model - очень хорошее введение в REST.
Думаю, для этого и нужен POST: буква U в CRUD.
Вы отправляете данные на существующий ресурс. Ресурс решает, что с ним делать, и обновляется. Кроме того, данные POST могут быть только фрагментом всего ресурса.
Twitter использует подход IMHO, а не RESTful, потому что они перегружают GET.