Как я должен отправить новый ресурс в конечную точку REST с помощью HATEOAS при отправке конечной точки POST уже со списком результатов - PullRequest
0 голосов
/ 23 мая 2019

У меня есть клиент Vue.js (проблема НЕ специфичная для Vue) и API отдыха с использованием парадигмы HATEOAS.У меня есть несколько программ (которые в настоящее время имеют имя и метку времени), которые я могу просматривать, редактировать и создавать.Поэтому конечная точка [BASE_URL] / api / Programs существует и возвращается при вызове корневой конечной точки (GET [BASE_URL]/api/)

Создание GET [BASE_URL]/api/programs возвращает все программы и ссылку для POSTing новой программы , если пользователь разрешен .

Если эта ссылка доступна, я отображаю кнопку создания .

Это уже приводит к моей проблеме,Как и в моем случае, у меня есть другой компонент Vue для этого.Поэтому, если пользователь нажимает кнопку, я не знаю ссылку POST в новом компоненте.

Ответ при запуске приложения (корневая конечная точка):

GET https://localhost:5001/api/

{
    "links": [
        {
            "href": "https://localhost:5001/api/Programs",
            "rel": "all-programs",
            "method": "GET"
        }
    ]
}

Ответ при перечислении всех программ:

GET https://localhost:5001/api/Programs

{
    "programs": [
        {
            "id": 1,
            "name": "MSR Hard 1 - 22mm",
            "createdAt": "2019-05-20T14:44:30.9508437",
            "srmSettings": [],
            "links": [
                {
                    "href": "https://localhost:5001/api/Programs/1",
                    "rel": "self",
                    "method": "GET"
                },
                {
                    "href": "https://localhost:5001/api/Programs?id=1",
                    "rel": "update",
                    "method": "PUT"
                }
            ]
        }
    ],
    "links": [
        {
            "href": "https://localhost:5001/api/Programs",
            "rel": "self",
            "method": "GET"
        },
        {
            "href": "https://localhost:5001/api/Programs",
            "rel": "create",
            "method": "POST"
        }
    ]
}

Теперь у меня есть два варианта.

Первый

Я мог бы передать ссылку на компонент создания.Но пользователь может напрямую перейти к созданию страницы, введя [base-url]/new-program в браузере.

В этом случае я вижу следующие проблемы:

  • У меня нет URL для публикации.(хотя у меня есть корневой контроллер, который отправляет мне URL для загрузки всех программ при запуске приложения - я мог бы использовать этот также для POSTing)
  • Если пользователю не разрешено создавать программу, ошибкабудет отправлено после того, как пользователь POST запустил программу, нажав кнопку SAVE - что очень поздно (но это первый контакт с сервером в данный момент).

Second

Сделайте запрос «init», когда компонент отображается (например, GET https://localhost:5001/api/Programs/init).Это возвращает инициализированный объект (может быть предварительно заполненный некоторыми значениями) вместе с доступными ссылками (ссылка для POSTing) или 403 - Запрещено, если пользователю не разрешено создавать программу.

* * * * * * * * * * * *ссылка вместо создать ссылку отправляется GET https://localhost:5001/api/Programs.Кнопка создания в представлении списка имеет вид , отображается только , если доступна init link .

Но у этого тот же недостаток , что и у первогоподход, когда пользователь непосредственно переходит на эту страницу.

  • Мне нужно жестко закодировать ссылку «init» (или создать ее на основе ссылки «all-Programs» корневой конечной точки)

Пожалуйста, поделитесь своими мыслями со мной.Я не уверен, что я что-то пропустил, или я не понимаю парадигму, или я просто что-то делаю неправильно: -)

Заранее спасибо!

Кристоф

...