Подтвердить что ты не робот

HTTP PATCH: обработка массивов, удаление и создание вложенных ключей

Я ищу практическое руководство по реализации глагола PATCH для частичного обновления существительного в RESTful api с использованием JSON. Понимая, что PATCH предназначен для частичных обновлений, нам не хватает стандартизации вокруг синтаксиса для удаления ключей, создания или обновления вложенных ключей и массивов.

Скажем, я GET объект:

// GET users/42
{
  id: 42,
  name: 'SimpleAsCouldBe',
  city: 'San Francisco',
  roles: ['viewer','editor'],
  posts: {
    '01': {},
    '02': {},
  }
}

... Затем я хочу его обновить:

// PATCH users/42
{
  name: 'SimpleGuy',                   // CLEAR:   update the key value
  email: '[email protected]',             // CLEAR:   add the new key
  city: null                           // UNCLEAR: delete the key?
  roles: ['owner'],                    // UNCLEAR: replace the whole array?
  posts: {
    '02': { title:'how to pop lock' }, // CLEAR:  update nested key
    '03': { title:'how to salsa' }     // CLEAR:  create new nested key
  }
  notes: {
    '01': { title: 'a note title' }    // CLEAR (but disallowed?): create wrapping key
  }
}

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

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

Как обрабатывать массивы, удаления и вложенные ключи в худшем виде с помощью HTTP PATCH?

4b9b3361

Ответ 1

spec четко описывает, как форматировать тело JSON запроса PATCH. Вы используете совершенно другой формат. Учитывая это, я не удивлен, что есть двусмысленность. Тело должно выглядеть примерно так:

   [
     { "op": "replace", "path": "/name", "value": "SimpleGuy" },
     { "op": "add", "path": "/email", "value": "[email protected]" },
     { "op": "replace", "path": "/city", "value": null },
     { "op": "replace", "path": "/roles", "value": [ "owner" ] },
     { "op": "add", "path": "/posts/02/title", "value": "how to pop lock" },
     { "op": "add", "path": "/posts/", "value": "03" },
     { "op": "add", "path": "/posts/03/title", "value": "how to salsa" },
     { "op": "add", "path": "/notes", "value": { "title": "a note title" } }
   ]

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