Как увеличить значение с помощью JSON Patch?

Нам нужно обновить счетчик через наш REST API, и мы используем JSON Patch для наших вызовов PATCH, поэтому он должен быть примерно таким:

{"op": "приращение", "путь": "/ счетчик", "значение": 1}

Проблема в том, что JSON Patch не поддерживает этот тип операции. Предполагается, что операция ADD работает только с массивами, поэтому ближайшим решением будет использование операции REPLACE для замены значения счетчика, но это может привести к проблемам, если несколько клиентов попытаются обновить счетчик одновременно.

Итак, как нам решить эту проблему и насколько неправильно было бы добавлять пользовательскую операцию, такую ​​как приращение?


person smoothoperator96    schedule 14.01.2020    source источник


Ответы (1)


Проблема в том, что JSON Patch не поддерживает этот тип операции. Предполагается, что операция ADD работает только с массивами, поэтому ближайшим решением было бы использовать операцию REPLACE для замены значения счетчика.

заменить - правильный ответ.

Это может привести к проблемам, если несколько клиентов попытаются обновить счетчик одновременно.

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

насколько неправильным было бы добавить пользовательскую операцию, например инкремент?

Совершенно неправильно. RFC 6902 четко указывает, что набор операций НЕ ДОЛЖЕН расширяться

Объекты операции ДОЛЖНЫ иметь ровно один член op, значение которого указывает операцию, которую необходимо выполнить. Его значение ДОЛЖНО быть одним из «добавить», «удалить», «заменить», «переместить», «скопировать» или «проверить»; другие значения являются ошибками.

Вы, конечно, можете определить новую спецификацию, которая будет включать в себя нужные вам операторы. Но там будет не так много инструментов, как ваши собственные патчи для тщеславия.

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

person VoiceOfUnreason    schedule 14.01.2020
comment
Как это сравнение и обмен работают? Был бы документ примерно таким? {[{op: test, path: counter, value: 40}, {op: replace, path: counter, value: 41}]} - person smoothoperator96; 15.01.2020
comment
Что-то очень похожее, да. - person VoiceOfUnreason; 15.01.2020
comment
Добавление не ограничивается списками: операция добавления выполняет одну из следующих функций, в зависимости от того, на что ссылается целевое местоположение: если в целевом местоположении указан индекс массива, новое значение вставляется в массив по указанному индексу. Если в целевом расположении указан член объекта, который еще не существует, к объекту добавляется новый член. Если в целевом местоположении указан член объекта, который действительно существует, значение этого члена заменяется. из RFC. Я понимаю, что добавление существующего значения эквивалентно замене. - person user1708042; 06.05.2021