Web services REST数组操作最佳实践
我可以通过REST完全访问foo资源:Web services REST数组操作最佳实践,web-services,api,http,rest,Web Services,Api,Http,Rest,我可以通过REST完全访问foo资源: { "name": "foo", "tags": [ "tag01", "tag02", "tag03" ] } 我想删除tags数组中的tag01 通常我会获取\foo并将\foo放回,而不使用tag01。 在这种情况下,这个对象很小,所以这是正常的 但是让我们假设它要大得多。对于这种情况,我不喜欢下载和上传这些数据。经过谷歌的一些调查,我发现了。我看起来正是我需要的 我以补丁方式提出的请求现在是 PATCH /fo
{
"name": "foo",
"tags": [
"tag01",
"tag02",
"tag03"
]
}
我想删除tags
数组中的tag01
通常我会获取\foo
并将\foo
放回,而不使用tag01
。
在这种情况下,这个对象很小,所以这是正常的
但是让我们假设它要大得多。对于这种情况,我不喜欢下载和上传这些数据。经过谷歌的一些调查,我发现了。我看起来正是我需要的
我以补丁方式提出的请求现在是
PATCH /foo/tags?op={add|delete}
要删除,我将使用:
PATCH /foo/tags?op=delete
根据这些数据:
{
"value": "tag01"
}
现在有两个人认为我不喜欢:
- 查询字段
-rfc或smth中是否描述了一些deafult名称。像这样op
- 请求数据中的成员
-这也是自由选择的名称值
op:remove
是错误的
是否有一些名称约定以补丁的方式执行
不,没有REST命名约定。URI结构对于REST客户端来说并不重要,因为它们遵循带有语义注释的超链接
如果您需要一个op:remove
或类似的东西,那么它表明您的URI-资源映射不好。可能您必须定义新的资源或重新考虑资源结构
我会将您想要的描述为批量创建和批量删除。您可以使用以下内容对此案例进行建模:
POST/collection[{},{},…]>201
DELETE/collection?filter=“…”->204
/foo/tags/tag01
/foo/tags/0
POST/foo/tags[“a”、“b”、“c”]
DELETE/foor/tags?name=“a,b,c”
因此,修补程序不是您正在寻找的方法,因为您正在创建和删除资源,而不是替换它们。修补程序的有效负载应包含以下内容。所有信息都应该在有效负载中传递,而不是在查询参数中传递 例如,您可以发送:
PATCH /foo
[
{
"op": "remove",
"path": "/tags/0"
}
]
路径/tags/0
指向数组的第一个元素。其余元素应向左移动
有关更多详细信息,请参阅。常见答案是正确的(我接受此答案的原因)。但在本例中,路径中的json指针不正确(ref:)。