Подтвердить что ты не робот

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

Некоторые ссылки, которые я нашел за это время:

4b9b3361

Ответ 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.