REST:“行动”的另一个问题

时间:2011-10-07 23:47:32

标签: rest action

我仍然试图围绕REST中的某些案例,其中使用名称而非动词定义的资源不如简单的CRUD案例那么直观。

我有一个“更新”资源,用于后端的更新/插件,其中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的回答,有一点说明:更新“更新”收集资源已经到位,它的工作原理如下:

  • 后端根据从外部服务器获取的更新列表(通过轮询)填充该集合(不使用rest,更新描述最少,纯文本)
  • 使用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"
       }
     }

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

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


2- 发布 demo.org/ 安装 等uri,以添加新的安装资源

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

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

虽然这可能会将安装资源逻辑地集中到一个安装集合中,但我原来的反应是删除此集合中的项目停止其安装。

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

更一般地说,在更新本身中设置“已安装”属性是不是更好?

如果用户想要暂停类似安装的内容,该怎么办?


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

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

提前致谢。

1 个答案:

答案 0 :(得分:4)

如果你POST到“更新”集合资源怎么样?这将返回202,其位置链接指向瞬态的“安装”资源。安装完成后,它将包含指向已部署的“更新”资源的链接。在某些时候,您可以垃圾收集安装资源。

所以对我来说,直观地说,你会在更新集合中添加更新,如果你想看到以前安装的更新,你可以获得这个集合。纯粹在安装过程中可用的操作,如暂停和取消,它们可以作为“安装”资源中的链接使用。


更新

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

POST /Installer
201 Created
Location: /Installation/345

暂停和取消条款是我将用于rel的内容。没有人应该给你一个艰难的时间。你用于那些rels的URI有点棘手。取消肯定可以通过删除安装资源来完成。也许你可以通过对/installation/345/status进行PUT来暂停。

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