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

StackOverflow https://stackoverflow.com/questions/232041

  •  04-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Насколько я понимаю, я бы не слишком волновался. Создайте тип носителя с частичным обновлением, который подходит вам, используйте 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-патча (см. http://tools.ietf.org/html/rfc7351).Однако, на мой взгляд, json-patch лучше всего подходит для ваших бизнес-данных.

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

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

Обновлять:Это РПК?

Что ж, если вы определяете 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top