【问题标题】:Creating one-to-one RESTful API relationship创建一对一的 RESTful API 关系
【发布时间】:2015-01-21 17:18:04
【问题描述】:

我需要在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 并让Site 对象的get 方法检测是否传入了game_id?我是否也应该让人们通过/sites/&lt;site_id&gt; 访问网站,还是应该让客户通过遍历所有games 来填充他们自己的sites 列表?最后,我通常对每个对象都有一个“href”属性,该属性是返回自身的链接。如果我采用上述设计(包括/sites/ URI),我是链接到/game/&lt;game_id&gt;/site 还是/sites/&lt;site_id&gt;?是否应该有两个地方可以访问相同的信息?

我在正确的轨道上吗?或者有没有更好的方法在 REST 中为一对一关系建模?

如果重要的话,我正在使用 Flask-RESTful 来制作我的 API。

【问题讨论】:

    标签: web-services rest http web


    【解决方案1】:

    你的想法很有意义。

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

    据我了解的 RESTful API 设计,通过/game/&lt;game_id&gt;/site/sites/&lt;side_id&gt; 公开相同的site 资源没有问题。但 REST 鼓励您通过超媒体链接数据。

    在两个不同的地方公开site 可能会使事情复杂化,因为您希望能够通过这两个 URL 与站点对象进行交互。

    我的建议是:让您的结构保持清晰和简单:

    按照链接对象设计,您的game 资源表示将包括以下内容:

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

    如果没有更多的设计工作,这意味着您将再次调用以获取该网站的信息。每个设计都有它的妥协:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      相关资源
      最近更新 更多