我正在和一个朋友一起做一个项目,当一个用户进入我的下一轮彩票游戏时,我们想给他们发一封电子邮件。我想向社区征求一些关于特定场景中什么是好的路线名称和层次结构的建议。
在我的一端,我有一个数据库和一个API。在我的数据库中,我有一个包含用户的表。在这个用户表上有一个名为IsProcessedForLottery的标志。每天晚上,我都会将用户发送到朋友的数据库表(只有IsProcessedForLottery =false的用户)。他的cron工作将运行对数据执行计算的代码(在他这一方),然后由他调用我的REST来告诉我谁中了彩票。这个呼吁应该做三件事:
假设我不能独自运行计算,他不能发送电子邮件,更重要的是,我不能调用他的API来询问某个特定用户是否是赢家。数据必须发送给他,而他必须在一段时间后将优胜者送回给我。
总之,我给他发送数据,他的算法运行,他调用我的API告诉我谁赢了。然后,我通过电子邮件告诉用户他们赢了,更新了用户,并在表中插入了记录。
实现这一目标的途径是什么?路由是否一定要映射回用户或类?例如
HTTP POST /users/1/lottery
这是否意味着用户1中了彩票?即使在用户下面没有彩票收藏?在我的申请中,彩票甚至都不是一门课。没有这样的概念,如/user/1/抽签/1,等等。是否所有路线都必须映射回类?在此操作中,我可以完成以上所有三件事情(电子邮件、更新用户,并在LotteryWinners表中添加行(全部为1次))。
或者其他的方法是说需要进行两个调用:
1. HTTP PUT /users/1
IsProcessedForLottery值设置为true的Update。这里唯一的问题是,我需要传递整个用户对象(表示为JSON ),这对于我需要更新的一个字段来说似乎太过了。然后是另一次呼叫
2. HTTP POST /lottery/
若要在彩票中奖者中插入用户ID为1的新行,然后发送电子邮件(我可以传递一些包含用户ID或用户对象的JSON )。
有什么想法吗?
非常感谢大家,感谢你们花时间阅读这篇文章:)
发布于 2015-01-08 02:46:56
在这个场景中,我认为一个好的REST设计如下所示:
HTTP POST /users/1?params
可以在params中设置要更新的字段。
要设计REST,这完全是为了自己设计,没有严格的规则或语法,但我们应该使它精确和容易理解一眼。在您提出的两个选项中,存在一些问题:
备选案文1:
对于REST路由,主URL中总是有分类良好的实体,在这种情况下,您只想更新用户,彩票只是用户的属性,而不是实体,所以它不应该在主URL中。
备选案文2:
正如你所说,要解决这个问题有点太复杂了。
无论如何,可以随意设计REST,它没有黄金规则,您可以引用一些众所周知的API,比如AWS。
以下是it的S3 API:http://docs.aws.amazon.com/AmazonS3/latest/API/APIRest.html
https://stackoverflow.com/questions/27831775
复制相似问题