我需要在 Game
之间创建一对一关系和一个 Site
- 每场比赛发生在一个网站。在我的数据库中,site
是指向 Site
的 Game 对象的一个属性对象。
我在互联网上找不到太多相关信息,这些是我的想法:
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
?最后,我通常为每个对象设置一个“href”属性,它是指向自身的链接。如果我采用上述设计(包括 /sites/
URI),我是否链接到 /game/<game_id>/site
或 /sites/<site_id>
?是否应该有两个地方可以访问相同的信息?
我走在正确的轨道上吗?或者是否有更好的方法在 REST 中对一对一关系进行建模?
如果重要的话,我正在使用 Flask-RESTful 来制作我的 API。
最佳答案
你的想法很有道理。
最大的区别在于是否 site
可以独立于 game
存在.听起来好像可以。例如,两个游戏可能指向同一个站点。
据我对 RESTful API 设计的理解,公开相同的 site
没有问题通过这两个资源 /game/<game_id>/site
并通过/sites/<side_id>
.但 REST 鼓励您通过超媒体链接数据。
公开site
在两个不同的地方可能会使事情复杂化,因为您随后希望能够通过这两个 URL 与站点对象进行交互。
为了使您的结构明确和简单,我的建议是:
- 在
/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
}
}
如果没有更多的设计工作,这意味着您将再次调用以获取该网站的信息。每个设计都有其妥协:)
关于web-services - 创建一对一的 RESTful API 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27097309/