REST:使用隐含ID作为输入从集合中删除资源

时间:2017-04-20 00:13:12

标签: rest http

我有一个资源:

/items

我想允许用户在此资源上下投票

POST /items/{item_id}/votes - 创建一个新的投票,通过他们的+或 - 投票

我可以通过以下方式获得投票(它使用来自访问令牌的登录用户ID来存储带有密钥[item_id, user_id]的投票):

GET /items/{item_id}/votes - 获取项目的所有投票

GET /items/{item_id}/upvotes - 获得对项目的所有投票

GET /items/{item_id}/downvotes - 对项目进行全部投票

所以votes是一个集合,但如果我想完全删除投票,我应该使用:

DELETE /items/{id}/votes ??并根据用户的ID删除 - 但是这个资源是指我不想删除整个集合的集合,我有足够的信息与user_id和item_id删除投票,但对我来说似乎不对。

我目前无法直接参考用户的投票,因此我应该为每次投票添加ID:

DELETE /items/{item_id}/votes/{vote_id}

或者只是:

DELETE /votes/{vote_id)

或者我可以在投票时使用身份证,我可以使用:

DELETE /item/{item_id}/votes/mine/ - 使用我登录的user_id

从集合中删除项目

所以要sumarise;使用REST通过HTTP方法从集合中删除项目的正确方法是什么?

更新

我觉得这些是最好的解决方案

POST /items/{item_id}/votes - 使用item_id和user_id(来自访问令牌)创建新投票

DELETE /item/{item_id}/votes/mine/ - 使用item_id和user_id(来自访问令牌)删除我的投票

1 个答案:

答案 0 :(得分:1)

这取决于你的收藏品的样子,但我认为如果投票是一个downvote,它会出现在downvotes集合和votes集合中。

这两个集合都应链接到这一个投票,理想情况下投票(尽管出现在2个集合中)应该在两个集合中都有相同的URL。

为了符合REST,您 确实应该为特定的投票资源提供特定的网址。如果/items/{item_id}/votes/{vote_id}是投票的唯一途径,那么DELETE和(如您所说)不是集合。

所以你的另一个例子:

DELETE /votes/{vote_id)

罚款。如果这是全局唯一的vote_id,则该资源仍可以显示在特定于帖子的downvotesupvotesvotes个集合中。

但是这个:

DELETE /item/{item_id}/votes/mine/

我个人可能会避免。这不是错误的,但是您需要mine出现在网址中的事实可能意味着您的客户端正在手动构建网址而不是发现网址。实际网址大多无关紧要。

回应您的更新

您还提到每个投票都与" user_id"相关联。这意味着您甚至不需要POST来首先创建投票。只需给客户正确的投票' url和PUT您的新投票资源。 (请记住,PUT通常更适合创建资源,因为它是幂等的。POST通常仅在客户端无法确定新资源网址的情况下才有用。

所以这些是我要采取的步骤:

  1. 客户可以通过/items/{item_id}
  2. 访问该项目
  3. 该项目应包含指向/items/{item_id}/votes/{user_id}的链接。
  4. 客户使用指向PUTDELETE投票的链接。