Как отформатировать ссылки HATEAOS в JSON-ответе - PullRequest
0 голосов
/ 23 июня 2018

Я создаю 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"
}

В отдельных справочных таблицах brewery и style связаны с пивом через таблицы пересечений.

ВОтвет json при запросе пива от http://localhost:5000/api/beer/{beerid} Я хочу предоставить объект пива и ссылки на ссылки (стиль 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 голосов
/ 24 июня 2018

Я хочу предоставить объект пива и ссылки на ссылки (стиль HATEAOS) на другие аспекты пива.

Высокий.

Вам, вероятно, следует взглянуть на гипермедиа форматы JSON, а не на свои собственные.

Но не то, что вы спросили.

Возможно, идти с этим

Может быть - я думаю, это зависит от того, как вы ожидаете, что клиенты будут использовать ссылки. Ожидается ли, что клиенту важно, какая ссылка на пивоваренный завод какая? Или клиенты, заинтересованные пивоваренными заводами, должны загрузить их все?

Подумайте о веб-странице - мы включаем графические ссылки в html, но ожидается, что клиент загрузит и отобразит их все. Гиперссылки (определяемые тегом a) обычно сопровождаются семантическим контентом, позволяющим клиенту различать их.

Таким образом, ваши пивоваренные заводы могут быть списком встроенных объектов с собственными ссылками, а не ссылками на сам ресурс пива.

Пример спецификации HAL , как мне кажется, представляет собой достойную иллюстрацию двух вариантов.

...