您将如何设计RESTful投票系统?

时间:2009-02-24 15:29:14

标签: rest

在我不断寻求尝试围绕RESTful-ness进行思考的过程中,我来到了另一个我不确定如何继续的地方。我为自己设定了一个思想表达,我为一个资源设计了一个简单的投票系统,就像SO如何允许对问题进行投票一样。所以,假设我的资源是图像,我可以通过ID获取图像,如下所示:

http://www.mysite.com/images/123123

在这个例子中,返回的是一个图像的JSON表示,如下所示:

{
"URL":"http://www.mysite.com/images/123123.jpg",
"Rep":"100"
}

我如何设计一种对该图像进行“投票”的方式?我想要两个操作;投票和投票。客户不应该知道每个人承受多少重量,因为我希望在服务器级别决定投票/投票,所以我可以随时更改它。

我的第一个想法是拥有这样的东西:

http://www.mysite.com/vote/images?image=123123

对于该URL,可以发布如下内容:

{
"Vote":"UpVote"
}

但我对此保持警惕 - 对我说伪装的RPC。设计这个会是一种糟糕的方式吗?如果是这样,我可以尝试其他什么设计?

5 个答案:

答案 0 :(得分:6)

为了安息,你应该回复这样的事情

{
"URL":"http://www.mysite.com/images/123123.jpg",
"Rep":"100"
"UpVoteLink":"http://blah, blah, blah",
"DownVoteLink":"http://blah, blah, something else blah",
}

就REST而言,链接的格式无关紧要。只要您的客户知道它应该对“UpVoteLink”或“DownVoteLink”进行POST,它就不会关心URL的格式。

此外,如果您在两周内决定不喜欢您选择的网址,则可以更改这些网址,而且没人会关心!

好的,好的,如果你真的想要一个url设计的建议,怎么样

POST http://www.mysite.com/UpVotes?url=http://www.mysite.com/images/1234.jpg

POST http://www.mysite.com/DownVotes?url=http://www.mysite.com/images/1234.jpg

这个设计很酷的是你可以对你网站上甚至没有的图像进行投票!

答案 1 :(得分:5)

就资源而言,图像是具有URI的东西(即使其成为资源的东西)。除此之外,它还有许多属性(大小,EXIF数据等)。

当您考虑图像的投票时,询问投票本身是否是资源。

有可能,对/ images / 23 /投票进行GET会返回摘要或UI用于在图像旁边显示的所有投票的列表。无论何时你想改变这些投票,你所改变的资源就是投票。

为了保持安宁,客户只需要了解您设计的媒体类型,而不是URI或投票所遵循的流程。

在您的示例中,您将定义在您的网站上随处可用的新格式。要重新制定yoru示例,将返回GET / images / 23 / votes(以xml为单位,但您可以在json中重新表示):

<votes>
 <link href="/images/23" rel="subject" />
 <form action="/images/23/votes" mediatype="application/json">
   <submit name="Vote" value="Up">Vote up</submit>
   <submit name="Vote" value="Down">Vote down</submit>
 </form>
</votes>

这种格式背后的想法是,您有一种通用的方法来定义客户端如何将数据发送到服务器并构建文档。所有先前已正确显示的检查都会使URI依赖于服务器。我建议您发送到服务器的内容应该以服务器发送的形式定义。

因此,花更多的时间来定义yoru json客户端将如何基于通用表单语言来理解如何构建用于提交的json对象,并且您会发现一旦完成,您在cient和服务器之间的耦合非常低,服务器可以灵活地更改所有细节,而不会破坏您的客户。

答案 2 :(得分:3)

REST API应该代表名词所以我认为你的第一部分是正确的:单个图像由单个URL表示(例如http://www.mysite.com/images/123123)。我不确定在/up_vote/down_vote is方向上进行攻击。

http://www.mysite.com/images/123123 对象,您想要修改它,而不是其他一些URL(除非您正在执行http://www.mysite.com/votes/images/123123)。我想你应该只发帖到http://www.mysite.com/images/123123。这使得GET请求本身具有非破坏性,因为它只是检索图像,保留了RESTful设计,并使您的URL保持清洁。

答案 3 :(得分:-1)

如果你正在使用Rails,我会选择这个GET-URL:

http://www.mysite.com/images/123123/up_vote

http://www.mysite.com/images/123123/down_vote

<强> 1 在图像控制器中定义动作“up_vote”和“down_vote”,并使其增加或减少图像模型对象的投票值。

<强> 2 在config / routes.rb中设置以下路由:

map.resources :images, :member => { :up_vote => :get, :down_vote => :get }

......你已经完成了(或多或少; - ))。

答案 4 :(得分:-3)

对我来说,发布像JSON

中包含的简单响应似乎很愚蠢

为什么不是这样简单的东西,你可以在AJAX调用中做到这一点,让它变得更好..

格式化如下的GET请求

http://www.mysite.com/vote.php?image=123&vote=up

或POST(这个例子使用jQuery)

$.post("http://www.mysite.com/vote.php", {image:"123", vote:"up"});

(假设PHP,但无论如何适用)