代码之家  ›  专栏  ›  技术社区  ›  Kevin Peterson

如何映射到一个RESTful接口?

  •  4
  • Kevin Peterson  · 技术社区  · 15 年前

    我正在构建一个小工具来帮助人们决定团体活动,比如他们应该去哪家餐馆吃午饭。我的对象是事件、选项和首选项。一个事件有几个选项,用户可以按顺序排列一个发明上的选项。所以用户的投票可能是1:选项B,2:选项A,3:选项C。

    我的问题是,最好的方法是什么?很明显,我应该在活动上支持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
    

    (在所有情况下,必须有经过身份验证的用户)

    我感到困惑的是,用户如何对事件的选项进行投票。似乎最适合休息的是对每个选项进行看跌,to/events/1/options/1/vote,但这似乎很难在投票之间强制执行要求,例如,如果我想强制投票对选项进行无关联排序,我可以在一次获得所有投票的情况下这样做,如1 b、2 a、3 c中所示,但如果用户更改了他的投票对于1 C、2 B、3 A,应用程序在这些请求之间处于无效状态。

    我是否应该将投票设置为单个包,并在/events/1/投票时访问它们?

    (这似乎是一个周末项目的过度计划,但我的目的是做对它,因为我没有那么奢侈的代码,我要写。)

    3 回复  |  直到 15 年前
        1
  •  4
  •   Josef Pfleger    15 年前

    因为投票是与用户、投票和选项相关的记录,所以我将投票设计为 POST /votes 基本上作为 创造 为这些投票记录采取的行动。然后,您可以明显地将几个投票组合成一个请求,该请求类似于以下示例(在JSON中):

    POST /votes
    [
        { option: 38, vote: 2 },
        { option: 39, vote: 1 },
        { option: 40, vote: 0 }
    ]

    在服务器上,您填写用户,并在一致性检查之后返回适当的状态代码。

        2
  •  1
  •   Josef Pfleger    15 年前

    我认为您需要做的第一件事是计算出您在接口中表示的对象是什么。这是设计REST接口的真正第一原则。

    不清楚您的对象是/事件/选项,其中事件拥有一组选项,操作是“添加投票”,还是模型是/人员/首选项/选项,其中人员的首选项是一组选项,操作是相同的“添加投票”。

    在这两种情况下,先前建议同时发布一组选项的想法都是正确的休息方法,其中/个人/偏好或/事件都是自己的选项集合,处理集合时,发布是适当的。

    如果你让用户对单个选项进行投票,那么在这两种情况下,你都会为一个特定选项设置投票计数。在这种情况下,/event/option/1或/person/preference/1(对于选项1)是合适的。

        3
  •  0
  •   eyelidlessness    15 年前

    我会这样做:

    /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 将被启用。