REST - 处理此方案的路由名称

时间:2015-01-08 01:54:35

标签: rest asp.net-web-api2

我正在与一位朋友合作开展项目,我们希望在用户进入彩票游戏的下一轮时向用户发送电子邮件。我想向社群提出一些建议,说明特定场景的良好路由名称和层次结构。

在我的结尾,我有一个数据库和一个API。在我的数据库中,我有一个包含用户的表。此用户表上有一个名为 IsProcessedForLottery 的标记。每天晚上我都会将用户发送到朋友的数据库表(只有IsProcessedForLottery = false的用户)。他的cron作业将运行代码来执行数据计算(在他身边),然后他的想法是让他调用我的REST API来告诉我谁赢了彩票。这个电话应该做3件事:

  1. 更新我的表格中的获胜用户以设置IsProcessedForLottery = true
  2. 通过表格中的电子邮件地址向该特定用户发送电子邮件
  3. 在“LotteryWinners”表格中插入新行
  4. 假设我不能自己运行计算,他不能发送电子邮件,更重要的是我无法调用他的API来询问特定用户是否是赢家与否。数据必须发送给他,他必须在一段时间后将获奖者发回给我。

    总而言之,我向他发送数据,他的算法运行,他调用我的API告诉我谁赢了。然后我通过电子邮件告诉用户他们赢了,更新用户,并在表格中插入记录。

    实现这一目标可能有哪些途径?路由是否必须映射回用户或类?例如

     HTTP POST   /users/1/lottery  
    

    这是否意味着用户1赢了彩票?即使用户下面没有彩票收集?彩票在我的申请中甚至不是一个类。没有/ users / 1 / lottery / 1等概念。所有路由都必须映射回类吗?在这个动作中,我可以做上面的所有3件事(电子邮件,更新用户,并在LotteryWinners表中添加一行中的所有行)。

    或者说REST方法是说需要进行两次调用:

     1. HTTP PUT /users/1   
    

    将IsProcessedForLottery值设置为true进行更新。这里唯一的问题是我需要传递表示为JSON的ENTIRE用户对象,这对于我需要更新的JUST ONE FIELD来说似乎有点过分了。接下来是另一个电话

     2. HTTP POST /lottery/
    

    在用户ID为1的彩票获奖者中插入新行,然后发送电子邮件(我可以传递一些包含用户ID或用户对象的JSON)

    有什么想法吗?

    非常感谢大家,感谢您花时间阅读本文:)

1 个答案:

答案 0 :(得分:1)

在这种情况下,我认为一个好的REST API设计是这样的:

HTTP POST /users/1?params

您可以在参数中设置要更新的字段。

要设计一个REST API,它本身就是如何设计的,没有严格的规则或语法,但我们应该让它一目了然地精确且易于理解。在您提出的两个选项中,存在一些问题:

选项1:

对于REST API路由,主URL中始终存在分类良好的实体,在这种情况下,您只想更新用户,而彩票只是用户的属性而非实体,因此它应该是不在主URL中。

选项2:

正如你所说,解决这个问题有点过于复杂。

任何方式,随意设计一个REST API,没有黄金规则,你可以引用一些着名的API,如AWS。

以下是它的S3 API: http://docs.aws.amazon.com/AmazonS3/latest/API/APIRest.html