【问题标题】:REST: yet another issue with "actions"REST:“动作”的另一个问题
【发布时间】:2011-10-07 23:47:32
【问题描述】:

我仍在尝试解决 REST 中的某些情况,其中使用由 names 而不是 verbs 定义的资源不如简单的 CRUD 情况那么直观。

我有一个“Update”资源,用于后端的更新/插件,其 Json 表示如下:

{
  "id": 1,
  "name": "Update Example",      
  "description": "demo update , adds handling of basic arduio type devices",
  "version": "0.0.4",
  "link": 
  {
     "rel": "self",
     "uri": "http://demo.org/updates/1",
     "type: application/json"
  },
 }

编辑: 为了澄清一下 Darrel Miller 的回答:一个更新的“更新”集合资源已经到位,它的工作方式如下:

  • 后端根据从外部服务器(不使用休息,更新描述最少,纯文本)获取的更新列表(通过轮询)填充该集合
  • 使用API​​的用户无法添加更新,只能获取更新列表,安装/卸载

现在问题是这样的:

我需要找到一个合适的、完全的方法来通过 API 安装更新,我想出了一些方法来做到这一点,但它们对我来说似乎都“不太正确”:


1- 添加更新资源的链接,添加安装资源并使用hateoas

将此添加到更新中:

   "link": 
      {
         "rel": "Installation",
         "uri": "http://demo.org/updates/1/installation",
         "type: "application/json"
      }

安装资源:

  {
       "installing": false,
       "installProgress": 0,
       "link": 
       {
         "rel": "self",
         "uri": "http://demo.org/updates/1/installation",
         "type: "application/json"
       }
     }

要开始安装过程,用户将 POSTdemo.org/updates/1/installation 以将 "installing": false 更新为 "installing": true

这似乎可行,但将“安装”添加为简单的布尔属性是一种好习惯吗?


2- POSTdemo.org/installations 之类的 uri,以添加新的 Installation 资源

从而开始安装过程,并且还需要在新创建的安装资源中添加指向正在下载的更新的链接:

 {
   "installProgress": 0,
   "link": 
    {
       "rel": "update",
       "uri": "http://demo.org/updates/1",
        "type: application/json"
    },
   }

虽然这可能会在逻辑上将安装资源集中到安装集合中,但我最初的反应是DELETE此集合中的一个项目以停止其安装。

在这种情况下,如果安装资源实例消失了,是否每次“导航”更新时使用“安装”链接都必须重新创建新的安装资源?

更一般地说,在 Update 本身中添加一个“installed”属性以使整体有意义不是更好吗?

如果用户想要暂停安装之类的东西怎么办?


我在各种文章和 stackoverflow 上查看了很多 of similar questions,但我仍然不太确定解决这些问题的最佳方法是什么。 另外,我知道 REST 不是关于动词(除了 HTTP 动词),但我仍然相信这是一个有效的问题。

所以请,非常欢迎任何反馈!

提前致谢。

【问题讨论】:

    标签: rest action


    【解决方案1】:

    如果您发布到“更新”集合资源会怎么样。这将返回带有位置链接的 202 到临时的“安装”资源。安装完成后,它将包含一个指向已部署“更新”资源的链接。在某些时候,您可以对安装资源进行垃圾收集。

    所以对我来说,直观地说,您会向更新集合添加更新,如果您想查看以前安装的更新,您可以获取此集合。纯粹在安装过程中可用的操作,如暂停和取消,可以作为“安装”资源中的链接提供。


    更新:

    好的,所以如果用户无法 POST 到 /updates,那么另一种方法是创建一个名为“Installer”的处理资源。

    POST /Installer
    201 Created
    Location: /Installation/345
    

    暂停和取消术语是我将用于 rel 的术语。没有人应该为此为难你。您为这些 rel 使用的 URI 有点棘手。取消肯定可以通过删除安装资源来完成。也许您可以通过对/installation/345/status 执行 PUT 来暂停。

    要实现这些额外的操作,几乎肯定需要创建一些其他类型的资源/子资源。没关系。在我看来,如果它是解决您问题的简单方法,您应该毫不犹豫地创建一个新资源。我们只有 HTTP 方法可以使用,因此对复杂行为进行建模需要我们利用新资源发挥创造力。

    【讨论】:

    • 感谢达雷尔的快速回答!我认为我应该更清楚地了解更新集合资源,因此我相应地编辑了问题。基本上该集合资源已经存在,并且用户不能不向其发布以添加更新(请参阅编辑)。但是,也许我可以使用您的方法(我确实喜欢让该 POST 返回指向瞬态“安装”的链接的想法),但是通过分离已安装与未安装的资源:即在安装新的“更新”时,发布到 demo.org/newupdates 代替。
    • 我也喜欢您回答的第二部分,在瞬态资源中暂停和取消链接符合它们仅存在于“安装”状态范围内的想法。但基本上我不会通过将停顿视为名词“停顿”来“作弊”(边界挑剔,但可能不赞成)?这是否也不会导致几乎只是布尔值的子资源的倍增?
    • 再次感谢,我想我会验证你的答案,因为它已经接近了!具有讽刺意味的是,它与我尝试过的解决方案之一非常相似,还有一个名为“UpdateStatus”等的附加资源。我想简化它以避免不必要的复杂性,但我想在 REST 中没有针对此类情况的“奇迹解决方案”,正如您所说,就资源而言,它需要一些“创造力”:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    相关资源
    最近更新 更多