Как отправить RESTful частичные обновления? - PullRequest
23 голосов
/ 24 октября 2008

Сэм Руби, автор "RESTful Web Services", кажется, выступает против использования HTTP PUT для частичных обновлений: http://intertwingly.net/blog/2008/02/15/Embrace-Extend-then-Innovate

Неясно, как частичные обновления должны иметь место. Как я прокомментировал в нижней части его блога, не ясно, как использование HTTP PATCH лучше, чем использование «документа патча» против HTTP PUT.

Стоит отметить, что, хотя Сэм выступает против неправильного использования HTTP PUT, он, похоже, тоже не поддерживает использование HTTP PATCH.

Как отправить частичные обновления RESTful?

Ответы [ 4 ]

21 голосов
/ 24 октября 2008

Как видно из комментариев в сообщении в блоге, на которое вы ссылались, нет согласованного способа частичного обновления. Если такие тяжеловесы, как Сэм Руби, Джо Грегарио, Марк Ноттингем, Марк Пилигрим, Билл де Хура и другие, не могут прийти к соглашению, какая у нас надежда?

Насколько я понимаю, я бы не слишком волновался. Создайте тип носителя с частичным обновлением, который подходит вам, используйте PATCH, чтобы указать свое намерение, и, когда, наконец, будет достигнуто соглашение по типу носителя общего назначения, измените сервер, чтобы он принимал оба формата.

Будьте благодарны, что если худшим грехом, который совершает ваш REST API, является злоупотребление PUT / PATCH, то у вас все хорошо.

16 голосов
/ 03 января 2013

Сейчас 2013 год - вам следует использовать PATCH для частичных обновлений - либо с помощью json-patch (см. http://tools.ietf.org/html/rfc6902 или http://www.mnot.net/blog/2012/09/05/patch), либо в документах xml-patch (см. * 1006). * На мой взгляд, json-patch лучше всего подходит для ваших бизнес-данных.

PATCH с документами JSON / XML patch имеет очень прямолинейную семантику для частичных обновлений. Если вы начнете использовать POST с измененными копиями исходного документа, для частичных обновлений вы вскоре столкнетесь с проблемами, когда вы хотите, чтобы пропущенные значения (или, скорее, нулевые значения) представляли либо «игнорировать это свойство», либо «установите это свойство на «Пустое значение» - и это приводит к кроличьей норе взломанных решений, что в итоге приведет к вашему виду формата патчей.

Более подробный ответ вы можете найти здесь: http://soabits.blogspot.dk/2013/01/http-put-patch-or-post-partial-updates.html.

Обновление: это RPC?

Что ж, если вы определяете RPC как отправку команд на сервер, то все операции HTTP являются вызовами RPC - независимо от того, получаете ли вы ресурс, ставите новое представление или удаляете его снова - каждая из них состоит из отправки команды ( глагол) GET / PUT / DELETE и т. д. и дополнительная полезная нагрузка. Просто так получилось, что рабочая группа HTTP (или кто бы то ни было) представила новый глагол PATCH, который позволяет клиентам выполнять частичные обновления ресурса.

Если что-либо, кроме отправки полного представления на сервер, считается стилем RPC, то по определению частичные обновления не могут быть RESTful. Можно выбрать такую ​​точку зрения, но люди, стоящие за веб-инфраструктурой, говорят по-другому - и таким образом определили новый глагол для этой цели.

RPC больше относится к туннелированию вызовов методов через HTTP таким способом, который невидим для посредников в сети - например, с использованием SOAP для переноса имен и параметров методов. Эти операции являются «невидимыми», поскольку не существует стандартов, определяющих методы и параметры внутри полезной нагрузки.

Сравните это с PATCH с приложением медиа-типа application / json-patch - цель операции хорошо видна любому посреднику в сети, поскольку глагол PATCH имеет четко определенное значение, а полезная нагрузка закодирована в другом четко определенном общедоступном Доступный формат, принадлежащий общему авторитету в сети (IETF). Итоговый результат - полная видимость для всех и отсутствие секретной семантики конкретного приложения.

REST также относится к «случайному повторному использованию», которое в точности совпадает с PATCH с application / json-patch - повторное использование существующего стандарта вместо изобретения конкретных прикладных протоколов, которые делают более или менее то же самое.

4 голосов
/ 09 октября 2011

Вместо того, чтобы самостоятельно создавать тип носителя с частичным обновлением и использовать еще нестандартный метод PATCH, вы можете присвоить частям своих ресурсов свой собственный URI.

1 голос
/ 22 марта 2011

HTTP PATCH теперь имеет RFC - HTTP PATCH RFC

...