REST数组操作最佳实践

3

我可以通过REST完全访问foo资源:

{
  "name": "foo",
  "tags": [
    "tag01",
    "tag02",
    "tag03"
  ]
}

我想删除tags数组中的tag01
通常情况下,我会进行GET \fooPUT \foo操作,但不包括tag01。在这种情况下,由于对象很小,所以这样做是可以的。
但是,如果对象很大,我就不想下载并上传这些数据了。经过一些谷歌搜索,我发现了http PATCH。它看起来正是我需要的。
我的PATCH请求如下:
PATCH /foo/tags?op={add|delete}

删除的话,我会使用:

PATCH /foo/tags?op=delete

使用这个数据:

{
  "value": "tag01"
}

现在有两个我不喜欢的事情:
  • 查询字段op - RFC或类似文档中是否描述了一些默认名称?
  • 请求数据中的成员value - 这也是自由选择的名称。
我觉得这看起来不正确。
有没有其他通过REST操作数组的方法?
在PATCH方式中有没有一些命名惯例?
2个回答

2

1
常见的答案是正确的(这也是我接受它的原因)。但在这种情况下,路径中的json-pointer是不正确的(参考:http://tools.ietf.org/html/rfc6902)。 - Walery Strauch

1

有没有其他通过REST操作数组的方法?

有,因为这不正确。在REST中,您将URL映射到资源(而不是操作),并使用HTTP方法和发送表示来操作资源。在URL或表示中具有op:remove是错误的。

是否有一些命名约定可以以PATCH方式执行它?

没有REST命名约定。URI结构对REST客户端无关,因为他们遵循带有语义注释的超链接。

如果您需要在某个地方使用op:remove或类似的内容,则表明您的URI-资源映射不好。可能需要定义新资源或重新考虑资源结构。

我会将您想要的描述为批量创建和批量删除。您可以使用以下内容对此进行建模:

  • POST /collection [{},{},...] -> 201
  • DELETE /collection?filter="..." -> 204

要从集合中删除某些内容,您需要一个资源标识符URI。在这种情况下,这可以包含标记名称或数组中的索引(如果有序)。

  • /foo/tags/tag01
  • /foo/tags/0

由您决定,但我会使用标记名称。

之后就很简单了:

  • POST /foo/tags ["a","b","c"]
  • DELETE /foor/tags?name="a,b,c"

因此,PATCH 不是您正在寻找的方法,因为您正在创建和删除资源,而不是替换它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接