Http PUT для добавочных обновлений

Мы внедрили веб-сервис RESTful. Вот как это выглядит

GET /person/1234
GET /person/list

POST /person
POST /person/list

PUT /person/1234
PUT /person/list

По сути, чтобы создать человека, вы отправляете сообщение в /person или /person/list.

Чтобы обновить человека, вы должны ПОДЕЛИТЬСЯ в /person/1234 или /person/list

Человек выглядит так:

<person>
  <id>1234</id>
  <name>Name1</name>
  <age>50</age>
  <education>high school</education>
</person>

Вопрос: Могу ли я использовать PUT, чтобы обновить человека, отправив

<person>
  <age>55</age>
</person>

Насколько я понимаю, PUT нельзя использовать для добавочных обновлений. Разве я не должен использовать POST для этого?

Можем ли мы смягчить определение PUT для этого варианта использования, чтобы упростить терминологию. Поскольку тогда PUT будет означать Update, POST будет означать Create.

Предположим, что вы не можете попросить клиента отправить полное представление ресурсов для обновлений.


person Qwer    schedule 14.10.2011    source источник


Ответы (3)


Вам неоднократно будут говорить, что вы не должны выполнять частичный PUT. Спецификация говорит, что вы не должны этого делать. Однако я еще не слышал убедительного аргумента относительно того, каковы негативные последствия этого.

Одна из самых длинных тем на эту тему находится здесь http://tech.groups.yahoo.com/group/rest-discuss/message/17500

person Darrel Miller    schedule 15.10.2011
comment
Привет Даррел, может быть, вы можете поделиться какой-нибудь идеей с этой проблемой Restlet: stackoverflow.com/questions/66794041/ - person Fireburn; 25.03.2021

Если ваш клиент поддерживает это, я думаю, что PATCH — это то, что вам нужно. :

ИСПРАВЛЕНИЕ для переопределения части указанного ресурса предсказуемым и эффективно транзакционным способом (если полное исправление не может быть выполнено целиком, сервер не должен выполнять какую-либо его часть)

person Jeff Ogata    schedule 14.10.2011
comment
Клиент не поддерживает. Я специально хочу узнать, могу ли я перегрузить значение PUT, чтобы делать для меня добавочные обновления. С какими проблемами я могу столкнуться, если сделаю это. - person Qwer; 15.10.2011
comment
Что такое клиент? Как именно это не позволяет PATCH? - person Julian Reschke; 15.10.2011

Хотя это и не очень популярно, в HTTP есть команда PATCH. Это то, что он предназначен, но не уверен, кто это реализует. POST обычно используется для исправления, но, насколько я знаю, он не является стандартом REST, но вы можете реализовать его, если получите это соглашение в своей среде.

person Diego Sevilla    schedule 14.10.2011
comment
Спасибо. Да, я знаю о PATCH, и мы не сможем его использовать. Однако вопрос в том, могу ли я использовать PUT для добавочных обновлений? - person Qwer; 15.10.2011
comment
Ну конечно можно сделать, но это не стандартно по ряду причин. Во-первых, он не является стандартным сам по себе (PUT указан не для этого, а для подстановки всего объекта); затем это может привести к несогласованному состоянию (что, если вы поместите частично несуществующий объект? введенной информации может быть недостаточно для построения функционирующего объекта) и т. д. - person Diego Sevilla; 15.10.2011