HAL / HATEOS(超文本应用程序语言)链接和取消链接资源

时间:2016-07-13 15:40:18

标签: rest hateoas spring-hateoas

我有一些问题重新定位HAL以及链接和取消链接资源的预期行为。我无法找到以下问题的指南或规范。

我试着做一个简单的例子,希望这能帮助更多的人(这是一个休息和管理多对多关系的问题,在这里也可以作为例子How to handle many-to-many relationships in a RESTful API?

想想一支球队和球员:球队有很多球员,球员属于很多球队。 休息服务以获得玩家和团队的名单/玩家和/团队,我可以向/ teams / {id}或/ players / {id}询问特定团队或玩家。

所以询问/团队的GET我会得到类似的东西:

   {
        "count": 2,
        "_embedded": {
            teams: [{
                "name": "red team",
                "_links": {
                    "self": {"href": "/teams/RT"},
                    "players": {"href": "/teams/RT/players"}
                }
            }, {
                "name": "blue team",
                "_links": {
                    "self": {"href": "/teams/BT"},
                    "players": {"href": "/teams/BT/players"}
                }
            }]
        },
        _links: {
            "self": {"href": "/teams"}
        }
    }

我正在考虑使用自我链接作为关键,以独特的方式识别资源 所以/ teams / RT或/ players / 1是表示Red Team和player 1的资源实例的键。

如果我想了解红队的球员,我会获得链接'球员'红色团队资源,所以当我获得/团队/ RT /玩家时,重新组合将是:

   {
        "count": "2",
        "_embedded": {
            players: [{
                "name": "Jack",
                "_links": {
                    "self": {"href": "/teams/RT/players/02"},
                    "myself": {"href": "/players/18"}
                }
            }, {
                "name": "George",
                "_links": {
                    "self": {"href": "/teams/RT/players/1"},
                    "myself?": {"href": "/players/3"}
                }
            }]
        },
        _links: {
            "self": {"href": "/teams/RT/player"}
        }
    }

问题(作为客户休息api消费者):

  1. 在每个嵌入式资源的自身中,我期望链接有助于理解嵌入式资源与相关资源之间的关系。 还需要取消列表中的资源链接! (在这个例子中,从Team Red中删除Jack,可以使用DELETE / teams / RT / players / 0完成。)
    它是否正确?或者哪个应该是自我href内容? 应该更正确/球队/ RT /球员/ 18或/球队/ RT /球员/ 0? (指玩家ID,或者关系的ID?)

  2. 我希望有一个链接能够区分/比较嵌入式相关资源,以及通用/资源/服务列表(或任何其他关系,例如团队组件)产生的通用资源蓝光!!) 在这个例子中,我自己?'使用href / players / 18它可以比较/ player GET中列出的资源。你知道吗这有什么指导方针吗?还是我在问题1中误解了自我的意思。?

  3. 将现有资源(例如/ players / 8)链接到现有团队(例如/ teams / BT),我可以通过多种方式进行,但我不知道哪个可能是最有效的一个(我知道它与多对多的关系,所以它可能还取决于谁拥有这种关系):

    • a:向球队/ BT /球员发布球员8的资源。因此,应该将其添加为球队的新关系(并且可以多次创建它!)。
    • b:向团队/ BT /玩家提供资源列表,这将取代existsint资源(详细)。
    • c:使用唯一的资源播放器8
    • 对团队/ BT /玩家进行补丁
  4. 注意:

    • 我不想在api服务中介绍' membership'的含义,因为它是db所需的连接表的抽象,以维持多对多的关系。在这个例子中,api消费者应该只知道一个团队与玩家有关系,玩家作为一个关系团队与团队。

    • 这个问题在一对多的关系中是一样的,从父亲到孩子都在看。例如:玩家有一张或多张他的照片。 所以/ players / 3有:

      _links:{   图片:{href:' / players / 3 / pictures'},   自我:{href:' / players / 3'} }

    如果我想将/ pictures / 193识别的图片添加到播放器3的现有图片列表中.... PATCH / players / 3 / pictures? 玩家3的图片列表将由玩家/ 3 /图片的GET解决:

       {
            "count": 2,
            "_embedded": {
                pcitures: [{
                    "url": "http://server-storage.com/images/pic_scan_12.jpg",
                    "_links": {
                        "self": { "href": "/players/3/pictures/845"},
                        "myself?": {"href": "/pictures/845"}
                    }
                }, {
                    "url": "http://server-storage.com/images_old/john_smith.jpg",
                    "_links": {
                        "self": { "href": "/players/3/pictures/293"},
                        "myself?": {"href": "/pictures/293"}
                    }
                }]
            },
            _links: {
                "self": {"href": "/players/3/pictures"}
            }
        }
    

0 个答案:

没有答案