我正在尝试设计一个“物品集合”资源。我需要支持以下操作:
这就是我已经走了:
创建集合:
==>
POST /service
Host: www.myserver.com
Content-Type: application/xml
<collection name="items">
<item href="item1"/>
<item href="item2"/>
<item href="item3"/>
</collection>
<==
201 Created
Location: http://myserver.com/service/items
Content-Type: application/xml
...
删除集合:
==>
DELETE /service/items
<==
200 OK
从集合中删除单个项目:
==>
DELETE /service/items/item1
<==
200 OK
但是,我发现支持其他操作有点棘手,即我可以使用哪些方法:
答案 0 :(得分:24)
最好使用非位置标识符(例如UUID)来收集项目,以避免在删除项目前面的项目时更改项目的网址等问题。 (当然,您仍然可以使用itemN
或仅N
,只要数字始终与同一项目相关联,在删除后留下空白,但UUID不会混淆。)< / p>
该集合包含网址/service/items/
。每个项目都有网址/service/items/<id>
。
如果您确实需要批量删除功能,请通过不同的,明确标记的API提供,例如PURGE / service / items。
答案 1 :(得分:1)
要将项目添加到集合中,请将它们发布到集合的URL(http://myserver.com/service/items
)。在您的情况下,您已经在XML中有一个“多项”表示,只是POST。
我不知道在一次操作中删除多个项目的简单方法...您可以将PUT添加到集合的项目中,并保留要保留的ID列表。 PUT更新容器的想法是什么,所以没有删除。并且,我认为提供您想要保留的整个数据没有用,只是提供项目的参考。
答案 2 :(得分:1)
PUT创建元素有什么问题?您引用了HTTP RFC,但据我所知,HTTP RFC并不排除使用PUT在您的集合中创建元素。如果我错过了什么,请做一个特定的引用,并摘录。
创建元素的PUT和POST之间的主要区别:
PUT应该是幂等操作; POST不是。
要删除单个事务中的多个元素,可以将DELETE发送到指定范围的URL(/ service / items / 13-20,或者可以将DELETE发送到/ service / items并使用HTTP Range标头(请参阅RFC2616 sec.14.35.2。。通常情况下,范围标头被构造为暗示字节范围,并在GET请求中使用,但是由您的资源决定DELETE上RANGE的含义。
答案 3 :(得分:0)
为什么不使用AtomPub规范并坚持写在那里的决定?这样,新客户端可以轻松地使用您的数据(使用GData库...简单),并且可以明确定义分页数据源和GET / POST / PUT / DELETE的语义。只是我的$ .02。
答案 4 :(得分:0)
使用Content-Type / text / uri-list并使用PUT,GET,PATCH,DELETE列表进行管理 链接到您要收集的资源。
您需要的PATCH格式可能非常简单:只需在“+”或“ - ”前加上每个uri为集合带来的更改模式。 不幸的是,根据我的知识,这种媒体类型可能被命名为text / uri-list-update,尚未正式注册。