Http идемпотентные частичные модификации ресурса лучше реализовать как PUT вместо PATCH? - PullRequest
0 голосов
/ 02 февраля 2019

HTPP PATCH метод считается не идемпотентным и применяет частичные модификации к ресурсу,

в отличие от PUT, который идемпотентен и применяет замену ресурса.

(как MDN состояния):

Метод запроса HTTP PATCH применяет частичные изменения к ресурсу.

Метод HTTP PUT позволяет только полную замену документа.В отличие от PUT, PATCH не идемпотентен, то есть последовательные идентичные запросы на исправление могут иметь разные эффекты.

Но возможно реализовать PATCH идемпотентным способом (MDN):

Однако можно выдавать запросы PATCH таким образом, чтобы они были идемпотентными.

Пример идемпотентной реализации патча:

path: /contact/:id
method: patch
body {
name: 'John'
}

независимо от того,Сколько раз будет выполнен этот запрос - ресурс останется в том же состоянии, что и после первого запроса.

, поскольку идемпотентный запрос оптимизируется ( ссылка ):

Клиенты могут автоматически отменить запрос GET, если его обработка занимает слишком много времени, и повторить его, поскольку они предполагают, что он имеет тот же эффект (поскольку GET является идемпотентом).Тем не менее, они не будут делать то же самое для запросов POST, потому что первый, возможно, уже изменил некоторое состояние на стороне сервера.

Как я понимаю, эта оптимизация может быть применена только к http-методам, которыесчитаются идемпотентными по стандарту HTTP.

Поэтому идемпотентный запрос PATCH, который я написал выше, не будет оптимизирован.(насколько я понимаю, стандарт HTTP гласит, что патч не идемпотентен, но не запрещает его реализацию как идемпотента).

Поскольку PUT считается идемпотентом по стандарту HTTP.Не предпочтительнее ли использовать запрос PATCH / contact /: id в качестве PUT (для получения упомянутой выше оптимизации)?

ОБНОВЛЕНИЕ 1


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

, что приводит меня к названию: idempotentЧастичные модификации ресурса лучше реализовывать как PUT вместо PATCH?


ОБНОВЛЕНИЕ 2:


Как указано в этом вопросе ответы: 1 , 2

Причина частичных модификаций идемпотента HTTP лучше не реализуется, поскольку PUT: Он не поддается архитектуре REST

некоторые из недостатков, которые идут с этим:

  1. другие программисты не поймут PUT частичного обновления, и следует написать дополнительную документацию относительно этой конечной точки.

  2. Не удастся получить точный ресурс, который был отправлен в предыдущем «PUT частичного обновления».

  3. , так как REST сфокусированна лЧто касается эволюции нашего API, то его соблюдение может сэкономить нам время в будущем.

и, возможно, существует гораздо больше недостатков, связанных с несоблюдением архитектурного стиля REST ...

но если мы посмотрим на это с точки зрения производительности, если запрос идемпотентен, то обновление Partial PUT лучше (поскольку оно получает оптимизацию, упомянутую выше).

я был бы радуслышать еще несколько причин, которые приходят на ум :).

Спасибо

1 Ответ

0 голосов
/ 02 февраля 2019

, как я понимаю, стандарт HTTP гласит, что патч не идемпотентен, но не запрещает его реализацию как идемпотента

Это правильно.Точнее сказать, что стандарт не гарантирует идемпотентную семантику.

Идемпотентные частичные модификации ресурса лучше реализовать как PUT вместо PATCH?

«Это зависит».

Да, вы правы в том, что если используется PUT, то универсальные компоненты смогут распознать, что сервер обещает идемпотентную обработку запроса, и, следовательно, будет автоматически выполнять повторную отправку.сообщение (например, если мы ожидаем прибытия ответа).

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

Но ... не существует такой вещи, как "частичное PUT".Если желаемое представление ресурса очень велико, а изменение, которое вы хотите внести, очень мало, то отправка патч-документа, а не полного представления, может иметь большой смысл.

Выборсводится к компромиссу между проблемами - какие из проблем, которые у вас есть, являются наиболее важными, и которые можно отклонить.

Почему не существует такой вещи, как частичное ПОЛОЖЕНИЕ?

Поскольку семантика HTTP не определяет это таким образом. RFC 7231

Метод PUT запрашивает, чтобы состояние целевого ресурса было создано или заменено на состояние, определенное представлением, включенным в полезную нагрузку сообщения запроса.Успешное PUT данного представления предполагает, что последующее GET на том же целевом ресурсе приведет к отправке эквивалентного представления в ответе 200 (ОК).

PUT не означаетmsgstr "применить идемпотентную обработку к этому запросу".Это означает заменить ;что-то аналогичное перезаписи файла в файловой системе или наборе переменных.

Имейте в виду, что универсальный интерфейс является одним из ограничений REST - именно это позволяет нам использовать generic компоненты для взаимодействия стандартным способом.

Если вы хотите частичную замену идемпотента, придерживаясь ограничений REST, то вам нужно создать спецификацию для нового метода.Есть четко определенный процесс и реестр , где вы можете найти стандарты для методов, которые прошли через этот процесс.

Определив метод, поставщики компонентовможет решить, стоит ли включать или поддерживать ваш новый стандарт.

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

...