【问题标题】:How does this map to a RESTful interface?这如何映射到 RESTful 接口?
【发布时间】:2009-08-03 03:16:08
【问题描述】:

我正在构建一个小工具来帮助人们决定小组活动,例如他们应该去哪家餐厅吃午饭。我的对象是事件、选项和偏好。一个事件有几个选项,用户可以按顺序对发明的选项进行排名。所以一个用户的投票可能是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/vote,但这似乎很难在投票之间强制执行要求,例如,如果我想强制投票来对选项进行排序,如果我一次获得所有选票,我可以这样做,如 1 B、2 A、3 C,但如果用户将他的选票更改为 1 C、2 B、3 A,应用在这些请求之间将处于无效状态。

我应该将投票打包成一个包,然后在 /events/1/votes 中访问它们吗?

(对于周末项目来说,这似乎是过多的计划,但我的目的是把它做好,因为我没有那么奢侈地编写有报酬的代码。)

【问题讨论】:

    标签: rest


    【解决方案1】:

    由于投票是与用户、投票和选项相关的记录,因此我将投票设计为POST/votes,本质上是这些投票记录的创建 操作。然后您显然可以将多个投票组合成一个类似于以下示例(在 json 中)的请求:

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

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

    【讨论】:

      【解决方案2】:

      我认为您需要做的第一件事是弄清楚您在界面中表示的对象是什么。这是设计休息界面的真正首要原则。

      不清楚您的对象是 /event/options ,其中事件拥有一组选项,操作是“添加投票”,还是模型是 /person/preferences/option,其中人员的偏好是一组选项并且操作是相同的'添加投票'。

      在任何一种情况下,之前建议的同时发布一组选项的想法都是正确的 RESTFUL 方法,其中 /person/preferences 或 /event 都是自己的选项集合,并且在处理集合时,POST是合适的。

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

      【讨论】:

        【解决方案3】:

        我会这样做:

        /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

        【讨论】:

        • URI 无关紧要 - 重要的是这些 URI 在对某个入口点的响应中作为字段发送,因此客户端不必构造它们或知道任何关于他们的内容。
        猜你喜欢
        • 2023-02-01
        • 2022-08-19
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        • 2019-04-07
        • 2018-12-22
        相关资源
        最近更新 更多