Как отправить RESTful частичные обновления?
Сэм Руби, автор "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 ответа
Как видно из комментариев в сообщении блога, на которое вы ссылались, не существует согласованного способа частичного обновления. Если такие тяжеловесы, как Сэм Руби, Джо Грегарио, Марк Ноттингем, Марк Пилигрим, Билл де Хура и другие, не могут прийти к соглашению, какая у нас надежда?
Насколько я понимаю, я бы не слишком волновался. Создайте тип носителя с частичным обновлением, который подходит вам, используйте PATCH, чтобы указать свое намерение, и, когда, наконец, будет достигнуто соглашение о типе носителя общего назначения, измените сервер, чтобы он принимал оба формата.
Будьте благодарны, что если худшим грехом, который совершает ваш REST API, является злоупотребление PUT/PATCH, то у вас все хорошо.
Сейчас 2013 год - вы должны использовать PATCH для частичных обновлений - либо с помощью json-patch (см. http://tools.ietf.org/html/rfc6902 или http://www.mnot.net/blog/2012/09/05/patch) или документы xml-patch (см. http://tools.ietf.org/html/rfc7351). На мой взгляд, json-patch лучше всего подходит для ваших бизнес-данных.
Патч с документами патчей JSON/XML имеет очень прямолинейную семантику для частичного обновления. Если вы начнете использовать 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 - повторное использование существующего стандарта вместо изобретения конкретных прикладных протоколов, которые делают более или менее то же самое.
Вместо того, чтобы самостоятельно создавать тип носителя с частичным обновлением и использовать еще нестандартный метод PATCH, вы можете присвоить частям своих ресурсов свой собственный URI.