【问题标题】:HTTP PATCH: Handling arrays, deletion, and nested key creationHTTP PATCH:处理数组、删除和嵌套键创建
【发布时间】:2014-04-02 18:44:41
【问题描述】:

我正在寻找一个实用指南来实现PATCH 动词,以便使用 JSON 在 RESTful api 中对名词进行部分更新。了解到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's value
  email: 'hey@google.com',             // 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 to creating nested keys。我认为这是一个规范错误,因为创建嵌套键是明确的。

我可以发送完整的对象差异,例如 this library 生成,但这使得添加或更新密钥的明确案例更加冗长。

如何使用 HTTP PATCH 以精简的方式处理数组、删除和嵌套键?

【问题讨论】:

  • 您应该使用JSON Pointers 来引用目标文档结构中的嵌套元素。 JSON Patch 使用有序的操作序列来更新目标 JSON 对象。数组是 JSON Patch 文档中描述的操作的有效值。
  • 这是一个非常有用的链接,@countfloortiles,谢谢。我们一直想知道如何表示树数据的路径,很高兴有一个规范可以使用。

标签: json api http rest architecture


【解决方案1】:

spec 清楚地详细说明了如何格式化 PATCH 请求的 JSON 正文。您使用的是完全不同的格式。鉴于此,我对存在歧义一点也不感到惊讶。身体应该看起来像:

   [
     { "op": "replace", "path": "/name", "value": "SimpleGuy" },
     { "op": "add", "path": "/email", "value": "hey@google.com" },
     { "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" } }
   ]

返回并阅读规范。它甚至提供了解决您大部分问题的示例。

【讨论】:

  • 谢谢,只是好奇在什么情况下它会创建一个新资源?他们都是op add?
  • @AlanLee 是的,我希望添加会创建一个新资源。替换,删除不会。
  • 谢谢,我正在执行 PATCH 请求,需要确定是创建还是更新现有记录。
  • rfc7396 JSON Merge Patch 提供了与原始问题中提议的请求一致的规范。
  • @JamesConkling 该 RFC 于 2014 年 10 月问世,即我回答后 6 个月。 :)
猜你喜欢
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
相关资源
最近更新 更多