我需要在Game
和Site
之间创建一对一的关系 - 每个游戏都在一个网站中进行。在我的数据库中,site
是Game对象的一个属性,它指向Site
个对象。
我在互联网上找不到这个,这些是我的想法:
GET /game/<game_id>/site
获取游戏网站,隐藏网站ID。
POST /game/<game_id>/site
创建游戏网站,仅在创建游戏时使用一次。
PUT /game/<game_id>/site
更新游戏网站
DELETE /game/<game_id>/site
删除游戏网站。
但是,如果有人想要获得所有网站的列表呢?我是否应该添加/sites
URI并使用get
方法检测Site
对象是否已传入game_id
?我还应该让人们通过/sites/<site_id>
访问网站吗?或者我应该让客户通过迭代所有sites
来填充自己的games
列表?最后,我通常会有一个&#39; href&#39;每个对象的属性,它是一个返回自身的链接。如果我使用上述设计(包括/sites/
URI),是否会链接到/game/<game_id>/site
或/sites/<site_id>
?是否应该有两个地方可以访问相同的信息?
我是否在正确的轨道上?或者,有没有更好的方法来模拟REST中的一对一关系?
如果重要,我使用Flask-RESTful制作我的API。
答案 0 :(得分:1)
你的想法非常有意义。
最大的区别是site
是否可以独立于game
而存在。听起来好像可以。例如,两个游戏可能指向同一个网站。
据我了解RESTful API设计,通过site
和/game/<game_id>/site
展示相同的/sites/<side_id>
资源并不存在问题。但REST鼓励您通过超媒体链接数据。
将site
暴露在两个不同的地方可能会使事情变得复杂,因为您希望能够通过这两个网址与网站对象进行互动。
我建议保持结构的明确和简单:
/sites
site
/site/<site_id>
资源
game
到site
的链接对象。见Thoughts on RESTful API design by Geert Jansen。在链接对象设计之后,您的game
资源表示将包含以下内容:
{
"game_id": 10,
...,
"link": {
rel: resource/site
href: /api/sites/14
}
}
如果没有更多的设计工作,这意味着您将再次拨打电话获取网站的信息。每个设计都有其妥协:)