RESTful сервисы и операции обновления - PullRequest
13 голосов
/ 22 февраля 2010

Я знаю, что 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

Является ли этот подход "духом" ОТДЫХА?

ОБНОВЛЕНИЕ : PUT -> POST

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

Ответы [ 4 ]

10 голосов
/ 22 февраля 2010

Идеальный способ сделать это - изменить часть (подресурс) ресурса и заставить сервер вернуть 303 См. Другое с заголовком Location, указывающим на измененный ресурс. 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>

4 голосов
/ 22 февраля 2010

POST следует использовать для модификации ресурса

РЕДАКТИРОВАТЬ: статья Мартина Фаулера Модель зрелости Ричардсона очень хорошее вступление к REST.

0 голосов
/ 20 марта 2013

Что не так с PATCH? Проблема "частичной модификации", кажется, требует этого, особенно учитывая, что иногда у вас нет всех данных, необходимых для "замены" ... Но, честно говоря, я не вижу смысла в следовании философии "POST = create, PUT = replace, PATCH = update", и я не вижу ничего плохого в использовании только POST.

0 голосов
/ 22 февраля 2010

Полагаю, для этого и используется POST: «U» в «CRUD».

Вы отправляете данные в существующий ресурс. Ресурс решает, что с ним делать, и обновляется. Кроме того, данные POST могут быть только фрагментом полного ресурса.

Подход Твиттера ИМХО не RESTful, потому что они перегружают GET.

...