RESTful услуги и операции обновления
Я знаю, что REST должен быть ориентирован на ресурсы, что примерно соответствует операциям CRUD на этих ресурсах с использованием стандартных методов HTTP. Но что я просто хотел обновить часть ресурса?
Например, скажем, у меня есть ресурс Payment
, и я хотел отметить его статус как "paid
". Я не хочу POST
весь объект Payment
через HTTP (иногда у меня даже нет всех данных).
Каким был бы RESTful способ сделать это? Я видел, что Twitter использует следующий подход для обновления статусов Twitter:
http://api.twitter.com/1/statuses/update.xml?status=playing with cURL and the Twitter API
Является ли этот подход "духом" REST?
ОБНОВЛЕНИЕ: PUT → POST
Некоторые ссылки, которые я нашел за это время:
Ответы
Ответ 1
Идеальный способ сделать это - изменить часть (вспомогательный ресурс) ресурса и вернуть серверу 303 См. "Другое с заголовком местоположения", чтобы указать на измененный ресурс. 303 См. Раздел "Другое" сообщает клиенту, что в результате запроса изменился другой ресурс и что клиент должен обновить представленное им представление.
В вашем примере (типы носителей гипотетические, конечно):
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>
Ответ 2
POST должен использоваться для изменения ресурса
EDIT: статья Мартина Фаулера Модель зрелости Ричардсона - очень хорошее введение в REST.
Ответ 3
Что случилось с PATCH?
Проблема "частичной модификации", похоже, требует этого, особенно учитывая, что иногда у вас нет всех данных, необходимых для "замены"...
Но, честно говоря, я не вижу смысла придерживаться философии POST = create, PUT = replace, PATCH = update религиозно, и я не вижу ничего плохого в использовании только POST.
Ответ 4
Я думаю, что для POST для: "U" в "CRUD".
Данные POST для существующего ресурса. Ресурс решает, что с ним делать, и обновляется. Кроме того, данные POST могут быть только фрагментом полного ресурса.
Подход Twitter - это ИМХО не RESTful, потому что они перегружают GET.