Вы столкнулись с одной из самых обсуждаемых проблем, с которыми я сталкивался за время работы с REST за последние несколько лет.
Вот упрощенный ответ:
По общему мнению, метод HTTP PUT имеет семантику замены, поэтому c2 перезаписывается и больше не существует.
Метод PATCH был недавно введен, чтобы помочь людям справляться с частичными обновлениями.
Теперь, есть два осложнения сценария:
1) Почему PUT должен заменить семантику? Каковы негативные последствия частичного обновления? Мне еще предстоит услышать действительно убедительный аргумент.
На самом деле, в спецификации HTTP не указано, что PUT имеет семантику замены, она говорит :
Метод PUT запрашивает, чтобы
вложенное представление храниться в
URI действующего запроса
однако, это также говорит
HTTP / 1.1 не определяет, как PUT
метод влияет на состояние происхождения
сервер.
2) Принято считать, что если вы предполагаете, что PUT имеет семантику замены, то сервер может включать некоторое содержимое в представление, которое не заменяется. например Если представление содержит ссылки, выполнение PUT представления, которое не содержит этих ссылок, не «удаляет» эти ссылки. То же самое для поля метки времени или последних измененных данных. Вечный вопрос - как определить, какой контент удаляется, когда клиент опускает, а какой остается, потому что сервер так говорит!
Лично я избегал PUT, потому что нашел семантику «замены» слишком сдерживающей. Однако в последнее время Майк Келли и Майк Амундсен начинают убеждать меня, что, возможно, PUT следует считать более гибким, чем мы в настоящее время считаем.