我正在寻找一个实用指南,使用 JSON 实现 PATCH
动词以部分更新 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 对创建嵌套键说不。我认为这是一个规范错误,因为创建嵌套键是没有歧义的。
我可以发送一个完整的对象差异,就像这个库生成的那样,但这使得添加或更新密钥的明显情况更加详细。
如何使用 HTTP PATCH 以精简的方式处理数组、删除和嵌套键?
该规范清楚地详细说明了如何格式化 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" } }
]
返回并阅读规范。它甚至给出了解决您大多数问题的示例。