REST - 处理这个场景的路由名称
REST - Handling a route name for this scenario
我正在和一个朋友一起做一个项目,我们想在用户进入我的下一轮彩票游戏时向他们发送一封电子邮件。我想就特定场景的良好路由名称和层次结构向社区询问一些建议。
在我这边,我有一个数据库和一个 API。在我的数据库中,我有一个包含用户的 table。此用户 table 上有一个名为 IsProcessedForLottery 的标志。每天晚上,我都会将我的用户发送到我朋友的数据库 table(仅限 IsProcessedForLottery = false 的用户)。他的 cron 作业将 运行 代码对数据执行计算(在他这边),然后他的想法是调用我的 REST API 来告诉我谁中了彩票。这个调用应该做 3 件事:
- 更新我的 table 中的中奖用户以设置 IsProcessedForLottery = true
- 通过 table
中的电子邮件地址向该特定用户发送电子邮件
- 在 "LotteryWinners" table
中插入一个新行
假设我不能运行自己计算,他不能在他这边发送电子邮件,更重要的是我不能调用他的API 询问特定用户是否是获胜者。数据要发给他,过段时间他还要把胜者发回给我
所以总而言之,我将数据、他的算法 运行 发给他,他打电话给我 API 告诉我谁赢了。然后我通过电子邮件告诉用户他们赢了,更新用户,并在 table.
中插入一条记录
实现这一目标的途径有哪些?路由是否必须映射回用户或 class?例如
HTTP POST /users/1/lottery
这是否意味着用户 1 中奖了?即使用户下面没有抽奖collection?在我的申请中,彩票甚至不是 class。没有/users/1/lottery/1等概念,是不是所有路由都要映射回classes?在此操作中,我可以一次性完成上述所有 3 件事(电子邮件、更新用户和在 LotteryWinners table 中添加行)。
或者说需要进行两次调用的 REST 方法:
1. HTTP PUT /users/1
将 IsProcessedForLottery 值设置为 true 进行更新。这里唯一的问题是我需要传递表示为 JSON 的整个用户 object,这似乎对我需要更新的一个字段来说太过分了。随后又打给
2. HTTP POST /lottery/
在用户 ID 为 1 的彩票获奖者中插入一个新行,然后发送电子邮件(我可以传递一些包含用户 ID 或用户 object 的 JSON)
有什么想法吗?
非常感谢大家,感谢您花时间阅读本文:)
在这种场景下,我认为一个好的RESTAPI设计是这样的:
HTTP POST /users/1?params
您可以在参数中设置要更新的字段。
设计一个RESTAPI,怎么设计都是自己的事,没有严格的规则和语法,但是要做到精确,一目了然。在你提出的两个方案中,存在一些问题:
选项 1:
对于 REST API 路由,主要 URL 中总是有分类良好的实体,在这种情况下,您只想更新用户,彩票只是一个属性用户不是一个实体,所以它不应该在主要 URL.
选项 2:
正如你所说,解决这个问题有点太复杂了。
随便设计一个RESTAPI,没有什么金科玉律,可以参考一些知名的API,比如AWS。
这是它的 S3 API:
http://docs.aws.amazon.com/AmazonS3/latest/API/APIRest.html
我正在和一个朋友一起做一个项目,我们想在用户进入我的下一轮彩票游戏时向他们发送一封电子邮件。我想就特定场景的良好路由名称和层次结构向社区询问一些建议。
在我这边,我有一个数据库和一个 API。在我的数据库中,我有一个包含用户的 table。此用户 table 上有一个名为 IsProcessedForLottery 的标志。每天晚上,我都会将我的用户发送到我朋友的数据库 table(仅限 IsProcessedForLottery = false 的用户)。他的 cron 作业将 运行 代码对数据执行计算(在他这边),然后他的想法是调用我的 REST API 来告诉我谁中了彩票。这个调用应该做 3 件事:
- 更新我的 table 中的中奖用户以设置 IsProcessedForLottery = true
- 通过 table 中的电子邮件地址向该特定用户发送电子邮件
- 在 "LotteryWinners" table 中插入一个新行
假设我不能运行自己计算,他不能在他这边发送电子邮件,更重要的是我不能调用他的API 询问特定用户是否是获胜者。数据要发给他,过段时间他还要把胜者发回给我
所以总而言之,我将数据、他的算法 运行 发给他,他打电话给我 API 告诉我谁赢了。然后我通过电子邮件告诉用户他们赢了,更新用户,并在 table.
中插入一条记录实现这一目标的途径有哪些?路由是否必须映射回用户或 class?例如
HTTP POST /users/1/lottery
这是否意味着用户 1 中奖了?即使用户下面没有抽奖collection?在我的申请中,彩票甚至不是 class。没有/users/1/lottery/1等概念,是不是所有路由都要映射回classes?在此操作中,我可以一次性完成上述所有 3 件事(电子邮件、更新用户和在 LotteryWinners table 中添加行)。
或者说需要进行两次调用的 REST 方法:
1. HTTP PUT /users/1
将 IsProcessedForLottery 值设置为 true 进行更新。这里唯一的问题是我需要传递表示为 JSON 的整个用户 object,这似乎对我需要更新的一个字段来说太过分了。随后又打给
2. HTTP POST /lottery/
在用户 ID 为 1 的彩票获奖者中插入一个新行,然后发送电子邮件(我可以传递一些包含用户 ID 或用户 object 的 JSON)
有什么想法吗?
非常感谢大家,感谢您花时间阅读本文:)
在这种场景下,我认为一个好的RESTAPI设计是这样的:
HTTP POST /users/1?params
您可以在参数中设置要更新的字段。
设计一个RESTAPI,怎么设计都是自己的事,没有严格的规则和语法,但是要做到精确,一目了然。在你提出的两个方案中,存在一些问题:
选项 1:
对于 REST API 路由,主要 URL 中总是有分类良好的实体,在这种情况下,您只想更新用户,彩票只是一个属性用户不是一个实体,所以它不应该在主要 URL.
选项 2:
正如你所说,解决这个问题有点太复杂了。
随便设计一个RESTAPI,没有什么金科玉律,可以参考一些知名的API,比如AWS。
这是它的 S3 API: http://docs.aws.amazon.com/AmazonS3/latest/API/APIRest.html