发送带有结果列表的POST端点时,如何使用HATEOAS将新资源发布到REST端点

时间:2019-05-23 08:24:12

标签: rest client hateoas

我有一个Vue.js客户端(问题不是 NOT Vue专用)和一个使用HATEOAS范式的Rest API。我有一些可以查看,编辑和创建的程序(当前有名称和时间戳)。因此,存在[BASE_URL] / api / programs端点,并在调用根端点(GET [BASE_URL]/api/)时返回

如果允许允许,则制作GET [BASE_URL]/api/programs将返回所有程序和发布新程序的链接。

如果该链接可用,我将显示一个创建按钮

这已经导致了我的问题。就我而言,我还有另一个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直接导航到创建页面。

在这种情况下,我会遇到以下问题:

  • 我没有可发布的网址。 (尽管我有一个根控制器,可在启动应用程序时向我发送网址以获取所有程序的网址-我可以使用 这个也用于发布)
  • 如果不允许用户创建程序,则在用户发布程序后,通过单击“保存”按钮将发送错误-这很晚了(但这是此时服务器的首次联系)。

第二

在呈现组件时(例如GET https://localhost:5001/api/Programs/init)发出“ init”请求。这将返回一个初始化的对象(可能预先填充了一些值)以及可用的链接(用于POST的链接),或者返回403-如果不允许用户创建程序,则被禁止。

初始链接而不是创建链接是由GET https://localhost:5001/api/Programs发送的。如果初始链接可用,则仅显示列表视图中的“创建”按钮。

但这与用户直接导航到该页面时的第一种方法具有相同的缺点

  • 我必须对“ init”链接进行硬编码(或基于根端点的“ all-programs”链接进行构建)

请与我分享您的想法。我不确定我是否错过了某些东西,或者我不理解该天堂,或者我只是做错了什么:-)

谢谢!

Christoph

0 个答案:

没有答案