我仍然试图围绕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的回答,有一点说明:更新“更新”收集资源已经到位,它的工作原理如下:
现在的问题是:
我需要通过API找到一种正确,安静的安装更新方式,我想出了几种方法来做到这一点,但它们对我来说似乎“不太对劲”:
将此添加到更新:
"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
这似乎可行,但将“安装”添加为简单的布尔属性是一种好习惯吗?
从而启动安装过程,并且还需要在新创建的安装资源中添加要下载的更新的链接:
{
"installProgress": 0,
"link":
{
"rel": "update",
"uri": "http://demo.org/updates/1",
"type: application/json"
},
}
虽然这可能会将安装资源逻辑地集中到一个安装集合中,但我原来的反应是删除此集合中的项目停止其安装。
在这种情况下,如果安装资源实例消失了,那么每次“导航”时,使用更新中的“安装”链接是否都必须重新创建新的安装资源?
更一般地说,在更新本身中设置“已安装”属性是不是更好?
如果用户想要暂停类似安装的内容,该怎么办?
我在各种文章和堆栈溢出中看了很多of similar questions,但我仍然不确定解决这类问题的最佳方法是什么。 另外,我知道REST不是关于动词(超出HTTP的动词),但我仍然相信这是一个有效的问题。
所以,非常欢迎任何反馈!
提前致谢。
答案 0 :(得分:4)
如果你POST到“更新”集合资源怎么样?这将返回202,其位置链接指向瞬态的“安装”资源。安装完成后,它将包含指向已部署的“更新”资源的链接。在某些时候,您可以垃圾收集安装资源。
所以对我来说,直观地说,你会在更新集合中添加更新,如果你想看到以前安装的更新,你可以获得这个集合。纯粹在安装过程中可用的操作,如暂停和取消,它们可以作为“安装”资源中的链接使用。
更新
好的,如果用户无法POST /更新,那么另一种方法是创建一个名为“Installer”的处理资源。
POST /Installer
201 Created
Location: /Installation/345
暂停和取消条款是我将用于rel的内容。没有人应该给你一个艰难的时间。你用于那些rels的URI有点棘手。取消肯定可以通过删除安装资源来完成。也许你可以通过对/installation/345/status
进行PUT来暂停。
实现这些额外的操作几乎肯定需要创建一些其他类型的资源/子资源。没关系。在我看来,如果它是您问题的简单解决方案,您应该毫不犹豫地创建新资源。我们只有HTTP方法可以使用,因此建模复杂行为需要我们使用新资源进行创作。