创建一对一的RESTful API关系

时间:2014-11-24 03:14:25

标签: web-services rest http web

我需要在GameSite之间创建一对一的关系 - 每个游戏都在一个网站中进行。在我的数据库中,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。

1 个答案:

答案 0 :(得分:1)

你的想法非常有意义。

最大的区别是site是否可以独立于game而存在。听起来好像可以。例如,两个游戏可能指向同一个网站。

据我了解RESTful API设计,通过site/game/<game_id>/site展示相同的/sites/<side_id>资源并不存在问题。但REST鼓励您通过超媒体链接数据。

site暴露在两个不同的地方可能会使事情变得复杂,因为您希望能够通过这两个网址与网站对象进行互动。

我建议保持结构的明确和简单:

在链接对象设计之后,您的game资源表示将包含以下内容:

{
  "game_id": 10,
  ...,
  "link": {
    rel: resource/site
    href: /api/sites/14
  }
}

如果没有更多的设计工作,这意味着您将再次拨打电话获取网站的信息。每个设计都有其妥协:)