我正在与一位朋友合作开展项目,我们希望在用户进入彩票游戏的下一轮时向用户发送电子邮件。我想向社群提出一些建议,说明特定场景的良好路由名称和层次结构。
在我的结尾,我有一个数据库和一个API。在我的数据库中,我有一个包含用户的表。此用户表上有一个名为 IsProcessedForLottery 的标记。每天晚上我都会将用户发送到朋友的数据库表(只有IsProcessedForLottery = false的用户)。他的cron作业将运行代码来执行数据计算(在他身边),然后他的想法是让他调用我的REST API来告诉我谁赢了彩票。这个电话应该做3件事:
假设我不能自己运行计算,他不能发送电子邮件,更重要的是我无法调用他的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)
有什么想法吗?
非常感谢大家,感谢您花时间阅读本文:)
答案 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