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

Rob*_*Rob 13 rest

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

http://www.mysite.com/images/123123
Run Code Online (Sandbox Code Playgroud)

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

{
"URL":"http://www.mysite.com/images/123123.jpg",
"Rep":"100"
}
Run Code Online (Sandbox Code Playgroud)

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

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

http://www.mysite.com/vote/images?image=123123
Run Code Online (Sandbox Code Playgroud)

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

{
"Vote":"UpVote"
}
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*ler 6

为了保持安宁,你应该回复这样的事情

{
"URL":"http://www.mysite.com/images/123123.jpg",
"Rep":"100"
"UpVoteLink":"http://blah, blah, blah",
"DownVoteLink":"http://blah, blah, something else blah",
}
Run Code Online (Sandbox Code Playgroud)

就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
Run Code Online (Sandbox Code Playgroud)

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

  • 嗯 - 我想我明白了,但UpVoteLink不是一个动作,而不是一个资源?难道你不能只有一个"VoteLink"和POST,并在那个请求中指定它是upvote还是downvote? (3认同)

Ser*_*Seb 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>
Run Code Online (Sandbox Code Playgroud)

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

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