2014-09-03 1 views
4

Вот что 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" }?

ответ

2

Единственная разница заключается в том, что свойство JSON используется вместо объекта JSON.

Это на самом деле немного глубже, чем это. Важна ссылка на RFC 6902. Первый запрос имеет Content-Type из application/json-patch+json, но второй application/json

Важно то, что вы используете «дифф тип носителя,» тот, который полезен для этой цели. Вам не нужно использовать JSON-PATCH (я большой поклонник json-merge-patch), но вы не можете просто использовать все, что хотите. То, о чем вы спрашиваете во второй части, в основном: «Могу ли я создать свой собственный тип носителя», а ответ «да», просто зарегистрируйте его и зарегистрируйте его с помощью IANA.

+0

Я вижу вашу точку зрения, но, с другой стороны, тип для моих сущностей (например, для 'POST' /' GET') не зарегистрирован в IANA. В настоящее время я использую 'application/json', но я мог бы использовать' application/vnd-user + json' для 'POST' /' GET', а затем 'application/vnd-user-partial + json' для' PATCH'. Почему 'PATCH' отличается от' POST'/'GET' и зачем ему нужен более формальный тип? –

+0

Они зарегистрированы, вы обслуживаете их как приложение/json. Важное различие заключается в том, что POST и GET ничего не говорят о том, каков их тип контента, но это определение PATCH. Это требует этого требования, поскольку оно присуще тому, как работает PATCH: внесение каких-либо изменений. –

+0

, и если вы это сделали, то 'application/vnd-user-partial + json' (хотя это действительно должно быть' application/vnd.user-partial + json') - это особый тип, о котором я упоминал. –

Смежные вопросы