如何在 JSON 响应中格式化 HATEOAS 链接

How to format HATEAOS links in JSON reponse

我正在构建一个包含啤酒数据的 API。 beer_lookup table 中的每种啤酒都具有以下特性:

{
    "beerid": "e2e73352-1cf3-4bd7-943a-e682c2498c09",
    "beername": "Barrel-Aged Mexican Cake (Bourbon)",
    "description": "",
    "abv": "10.5",
    "ibu": "",
    "status": "Verified",
    "dateadded": "2017-08-28T00:00:00"
}

在单独的查找中 tables 我有 brewerystyle 通过相交 tables 链接到啤酒。

在向 http://localhost:5000/api/beer/{beerid} 索要啤酒时的 json 响应中,我想提供啤酒对象和指向啤酒其他方面的参考链接(HATEAOS 样式)。目前我的回答是这样的,我认为这没问题,除非啤酒可以有多个啤酒厂(合作)。我应该如何处理多个 "rel": "brewery" 链接? _links 是否应该包含一个名为 breweries 的数组?我知道我完全可以 return 随心所欲,但我想知道是否有类似的标准。

{
    "value": {
        "beerid": "e2e73352-1cf3-4bd7-943a-e682c2498c09",
        "beername": "Barrel-Aged Mexican Cake (Bourbon)",
        "description": "",
        "abv": "10.5",
        "ibu": "",
        "status": "Verified",
        "dateadded": "2017-08-28T00:00:00"
    },
    "_links": [
        {
            "href": "http://localhost:5000/api/beer/e2e73352-1cf3-4bd7-943a-e682c2498c09",
            "rel": "self",
            "method": "GET"
        },
        {
            "href": "http://localhost:5000/api/brewery/32efb254-b418-4c59-bc30-5cec97e3d702",
            "rel": "brewery",
            "method": "GET"
        },
        {
            "href": "http://localhost:5000/api/brewery/989b1eaa-fe92-423b-a275-4895ed90da51",
            "rel": "brewery",
            "method": "GET"
        },
        {
            "href": "http://localhost:5000/api/style/2689dcb0-9419-43c8-918f-4fc411fc0f90",
            "rel": "style",
            "method": "GET"
        }
    ]
}

编辑:可能会这样:

{
    "value": {
        "beerid": "e2e73352-1cf3-4bd7-943a-e682c2498c09",
        "beername": "Barrel-Aged Mexican Cake (Bourbon)",
        "description": "",
        "abv": "10.5",
        "ibu": "",
        "status": "Verified",
        "dateadded": "2017-08-28T00:00:00"
    },
    "_links": {
        "self": {
            "href": "http://localhost:5000/api/beer/e2e73352-1cf3-4bd7-943a-e682c2498c09"
        },
        "breweries": [
            {
                "href": "http://localhost:5000/api/brewery/32efb254-b418-4c59-bc30-5cec97e3d702"
            },
            {
                "href": "http://localhost:5000/api/brewery/989b1eaa-fe92-423b-a275-4895ed90da51"
            }
        ],
        "style": {
            "href": "http://localhost:5000/api/style/2689dcb0-9419-43c8-918f-4fc411fc0f90"
        }
    }
}

I want to provide the beer object and ref links (HATEAOS style) to other aspects of the beer.

太棒了。

您可能应该看看 JSON 超媒体格式,而不是自己动手。

虽然不是你问的。

Possibly going with this

也许 - 我认为这取决于您期望客户如何使用 link。客户是否希望关心哪些啤酒厂 link 是哪个?还是对啤酒厂感兴趣的客户希望加载所有这些?

想想一个网页——我们在 html 中包含图像 links,但客户端需要下载并呈现所有这些图像。 Hyperlinks(由 a 标签定义)通常伴随着一些语义内容以允许客户端区分它们。

因此,您的啤酒厂 可能 是具有自身 link 的嵌入对象列表,而不是啤酒资源本身的 link。

我认为 HAL specification 上的示例很好地说明了这两个选项。