Вот что RFC 5789 говорит:Является ли частичное представление документа допустимым «набором изменений» в соответствии с HTTP PATCH RFC?
патче запросы метод, что множество изменений, описанных в запросе лица быть применены к ресурсу, идентифицированного Request-URI. Набор изменений представлен в формате, называемом «патч-документом», идентифицированным типом носителя. Если Request-URI не указывает на существующий ресурс, сервер МОЖЕТ создать новый ресурс в зависимости от типа документа патча (может ли он логически модифицировать нулевой ресурс) и разрешений и т. Д.
Разница между Запросы PUT и PATCH отражаются так, как сервер обрабатывает закрытый объект для изменения ресурса, идентифицированного Request-URI. В запросе PUT закрытый объект рассматривается как модифицированная версия ресурса, хранящегося на исходном сервере, и клиент запрашивает замену сохраненной версии. Однако с помощью PATCH закрытый объект содержит набор инструкций, описывающих, как ресурс, находящийся в настоящее время на исходном сервере, должен быть изменен для создания новой версии.
Предположим, у меня есть { "login": "x", "enabled": true }
, и я хочу его отключить.
По словам Поста "Please. Don't Patch Like An Idiot.", собственно запрос PATCH будет
[{ "op": "replace", "path": "/enabled", "value": false }]
Однако, давайте рассмотрим этот запрос:
{ "enabled": false }
Он также «содержит набор инструкций, описывающий, как в настоящее время проживающая ресурс на сервере происхождения следует изменить ', единственное различие заключается в том, что вместо объекта JSON используется свойство JSON.
Это кажется менее сильным, но при изменении массива может потребоваться какой-то другой специальный синтаксис (например, {"a":{"add":[], "remove":[]}}
), и в любом случае логика сервера не сможет обрабатывать что-либо более мощное.
Это неправильный запрос PATCH в соответствии с RFC? И если да, то почему?
А с другой стороны, был бы правильный запрос PATCH { "op": "disable" }
?
Я вижу вашу точку зрения, но, с другой стороны, тип для моих сущностей (например, для 'POST' /' GET') не зарегистрирован в IANA. В настоящее время я использую 'application/json', но я мог бы использовать' application/vnd-user + json' для 'POST' /' GET', а затем 'application/vnd-user-partial + json' для' PATCH'. Почему 'PATCH' отличается от' POST'/'GET' и зачем ему нужен более формальный тип? –
Они зарегистрированы, вы обслуживаете их как приложение/json. Важное различие заключается в том, что POST и GET ничего не говорят о том, каков их тип контента, но это определение PATCH. Это требует этого требования, поскольку оно присуще тому, как работает PATCH: внесение каких-либо изменений. –
, и если вы это сделали, то 'application/vnd-user-partial + json' (хотя это действительно должно быть' application/vnd.user-partial + json') - это особый тип, о котором я упоминал. –