哪个HTTP动词适合设置布尔值?

时间:2011-01-18 11:12:17

标签: web-services http rest

我有一个RESTful Web服务,它公开了一个资源,使您(登录用户)能够喜欢或不同于博客文章。我的问题是:表达此资源的RESTful正确方法是什么?

我的第一次刺伤看起来像:

PUT    /likes/<blog_entry_id> # marks this blog entry as liked 
DELETE /likes/<blog_entry_id> # marks this blog entry as not liked

这个语义至少与PUT和DELETE的幂等性要求一致(即,除非穿插DELETE,否则重复调用PUT没有效果,反之亦然)。

是否有更传统的设计来管理布尔HTTP资源?

4 个答案:

答案 0 :(得分:1)

您需要在URI中包含某种用户标识。通过使用“登录用户”,您违反了资源标识约束和自描述约束。

唯一的另一个问题是你似乎在没有传递身体的情况下使用PUT。我以前从未见过这样做过。 HTTP规范很可能允许它,它有点奇怪。

答案 1 :(得分:0)

我认为你的方法很好,很安静。 您也可以使用POST而不是PUT。

答案 2 :(得分:0)

我将不再使用资源URL中的动词,而是使用以下方案:

POST /blog/<id>/fan发送您要创建的资源的用户ID和其他数据,作为“赞”操作的一部分。我在这里假设JSON,所以这可能是一个例子{“user”:“http://..../user/34343”,“timestamp”:234353443}

然后你可以使用 GET /blog/<id>/fan获取喜欢博客文章的所有用户的列表。我可能会发送一个资源的JSON演示文稿,这样可以很容易地列出这些用户并按照链接获取类似操作的数据(如果有的话)

GET /blog/<id>/fan/<user-id>获取类似操作的数据(如果有的话)

答案 3 :(得分:0)

在关系数据库中,我将其称为连接表的一个很好的候选者。

LIKES
-----
id
blog_id
user_id
some_other_attribute_about_this_relationship
another_attribute
timestamp

所以你创建的是Like,或Fan,或BlogLike,或BlogFan,或BlogLiker,或者,如果你不是整个简洁的东西,你知道,fan_of_a_blog。

所以这些是你的动词:

GET /likes        return a list of Likes
POST /likes       create a new Like (payload is blog_id and user_id)
GET /likes/id     return a specific Like resource
PUT /likes/id     update a Like with new data
DELETE /likes/id  delete a Like

这将允许您在联接的任何一方提问。例如,这个用户喜欢某个博客吗?这个博客是否被3个以上的用户所喜欢?等等。