我正在建立一个小工具来帮助人们决定小组活动,比如他们应该去哪个餐馆吃午饭。我的对象是事件,选项和首选项。事件有多个选项,用户可以按顺序对发明中的选项进行排名。因此,用户的投票可以是1:选项B,2:选项A,3:选项C.
我的问题是将此映射到REST的最佳方法是什么?很明显,我应该支持CRUD事件,
GET /events/ : list of events
POST /events/ : create a new event
GET /events/1 : get event one
and on options with:
POST /events/1/options : add a new option to the event
(在所有情况下,必须有经过身份验证的用户)
我感到困惑的是用户如何对事件的选项进行投票。什么似乎最适合REST是为每个选项做一个PUT,/ events / 1 / options / 1 /投票,但这似乎很难在投票之间强制执行要求,例如,如果我想强制在没有关系的情况下对选项进行排名的选票,如果我一次获得所有选票,我可以这样做,如1 B,2 A,3 C,但是如果用户将他的投票改为1 C,2 B,3 A,应用程序在这些请求之间处于无效状态。
我应该将投票作为一个包,并在/ events / 1 / votes?
访问它们(对于一个周末项目来说,这似乎是一个过多的计划,但我的目的是做得对,因为我没有那么奢侈的代码我付钱写。)
答案 0 :(得分:4)
由于投票是与用户,投票和选项相关的记录,因此我将投票设计为POST
到/votes
,基本上是作为创建的操作这些投票记录。那么你显然可以将几个投票组合成一个看起来类似于以下示例的请求(在json中):
POST /votes
[
{ option: 38, vote: 2 },
{ option: 39, vote: 1 },
{ option: 40, vote: 0 }
]
在服务器上填写用户并在一致性检查后返回适当的状态代码。
答案 1 :(得分:1)
我认为您需要做的第一件事就是找出您在界面中表示的对象。这是设计休息界面的真正首要原则。
目前尚不清楚您的对象是/ event / options,其中事件拥有一组选项,操作是“添加投票”,或者模型是/ person / preferences /选项,其中此人的偏好是设置选项并且操作是相同的'添加投票'。
在任何一种情况下,之前建议一次性POST一组选项的想法是一种正确的RESTFUL方法,其中/ person / preferences或/ event都是自己的选项集合,在处理集合时,POST是合适的。
如果您让用户对各个选项进行投票,那么在这两种情况下,您都要为特定选项设置投票计数。在这种情况下,/ event / option / 1或/ person / preference / 1(对于选项1)的PUT是合适的
答案 2 :(得分:0)
我会这样做:
/events/1/options/vote/1stchoice
/events/1/options/vote/2ndchoice
/events/1/options/vote/3rdchoice
/events/1/options/vote/4thchoice
…
这样,如果用户想要投票选择A作为他的第一选择,B作为他的第二选择等,他会将“A”投入/ events / 1 / options / vote / 1stchoice,“B”来/ events / 1 / options / vote / 2ndchoice等。
如果用户想要改变他的选择(例如,先做B,A秒),他需要删除他的选票然后重新制作。
在用户只能选择一个选项的民意调查中,只会启用options/vote/1stchoice
。