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

时间:2018-06-23 15:22:14

标签: rest hateoas

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

{
    "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"
}

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

在从http://localhost:5000/api/beer/{beerid}询问啤酒的json响应中,我想提供啤酒对象和ref链接(HATEAOS样式)到啤酒的其他方面。我的回应目前看起来像这样,除了啤酒可以有多个啤酒厂(合作)的情况,我认为还可以。我应该如何处理多个"rel": "brewery"链接? _links是否应包含名为breweries的数组或其他内容?我知道我可以完全返回自己想要的任何东西,但是我想知道是否有类似的标准。

{
    "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"
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  

我想提供啤酒对象和ref链接(HATEAOS样式)到啤酒的其他方面。

太棒了

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

不过,不是你问的。

  

可能与此

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

想想一个网页-我们在html中包含图像链接,但是希望客户端下载并呈现所有链接。超链接(由a标记定义)通常带有一些语义内容,以使客户端可以区分它们。

因此您的啤酒厂可能是带有自我链接的嵌入式对象列表,而不是啤酒资源本身上的链接。

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