Как поддерживать частичные обновления (PATCH) в REST - PullRequest
26 голосов
/ 15 ноября 2011

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

HTTP MODIFY глагол для REST?

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

http://jacobian.org/writing/rest-worst-practices/

https://github.com/archiloque/rest-client/issues/79

http://tools.ietf.org/html/draft-dusseault-http-patch-16

http://greenbytes.de/tech/webdav/draft-dusseault-http-patch-06.html

http://jasonsirota.com/rest-partial-updates-use-post-put-or-patch

http://bitworking.org/news/296/How-To-Do-RESTful-Partial-Updates

https://github.com/dharmafly/jsonpatch.js

Пожалуйста, предложите любое правильное решение для этого.

Ответы [ 3 ]

92 голосов
/ 29 февраля 2012

Согласно RFC5789 (http://tools.ietf.org/html/rfc5789), это именно то, для чего предназначен PATCH:

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

Различие между PATCH и PUT описывается так:

Разница между запросами PUT и PATCH отражена в способ, которым сервер обрабатывает вложенную сущность для изменения ресурса идентифицируется запросом-URI. В запросе PUT вложенный объект считается модифицированной версией ресурса, хранящегося на исходный сервер, а клиент запрашивает сохраненную версию быть замененным Однако с помощью PATCH вложенный объект содержит набор инструкций, описывающих, как ресурс в настоящее время находится на Исходный сервер должен быть изменен для создания новой версии.

Также описаны ограничения POST:

Метод PUT уже определен для перезаписи ресурса. с полностью новым телом, и не может быть повторно использован для частичных изменений. В противном случае прокси и кэши, и даже клиенты и серверы, могут получить запутался относительно результата операции. POST уже используется, но без широкой совместимости (например, не существует стандартного способа обнаружение поддержки формата патча) [...]

Я бы посоветовал вам прочитать RFC и принять собственное решение, но мне это кажется довольно четким - запросы PATCH должны обрабатываться как частичные обновления. (NB они НЕ идемпотентны, в отличие от PUT.)

РЕДАКТИРОВАТЬ: как указал Евгений в комментариях, хотя запросы PATCH "neither safe nor idempotent as defined by [RFC2616]", они могут быть сделаны так:

Запрос PATCH может быть выдан таким образом, чтобы быть идемпотентным, что также помогает предотвратить плохие результаты от столкновений между двумя PATCH запрашивает один и тот же ресурс в течение аналогичного периода времени. Столкновения из нескольких запросов PATCH могут быть более опасными, чем PUT столкновения, потому что некоторые форматы патчей должны работать с известная базовая точка, иначе они повредят ресурс. клиенты При использовании такого типа патча СЛЕДУЕТ использовать условный запрос такой, что запрос не будет выполнен, если ресурс был обновлен поскольку клиент последний раз обращался к ресурсу. Например, клиент может использовать сильный ETag [RFC2616] в заголовке If-Match в PATCH запрос.

0 голосов
/ 09 ноября 2017

Вы должны использовать метод PATCH, как описано в RFC-7386 «json merge PATCH».

Например, если вы хотите изменить значение «a» и удалить «f» в ресурсе, например:

   {
     "a": "b",
     "c": {
       "d": "e",
       "f": "g"
     }
   }

Вы можете достичь этого, отправив:

       PATCH /target HTTP/1.1
       Host: example.org
       Content-Type: application/merge-patch+json

       {
         "a":"z",
         "c": {
           "f": null
         }
       }
0 голосов
/ 24 января 2012

PATCH должен использоваться с форматом исправления, только для исправления на уровне документа (иначе говоря, в реальном представлении). Его использование для других целей является сомнительным и спорным, и неясно, что метод был разработан для использования не в медиа-типах.

В целом POST будет правильным подходом, но вы можете вместо этого разделить свой ресурс на несколько ресурсов и изменить их.

[Отредактировано для ясности, поскольку некоторые не читают комментарии]

...