我将设计一个RESTful API来备份和还原数据库。
我想知道是否存在一种RESTful且合理的方法...
API应该支持3种操作:
前两个看起来很简单:
paths:
/foo/backups:
post:
# create a backup
/foo/backups:
get:
# list available backups
但是如何从备份还原呢?
我看到了一些选择-到目前为止,没有一个让我真正满意的:
忘记REST并通过HTTP进行RPC。就像
一样paths:
/foo/backups/{backupId}:
post:
requestBody:
content:
application/json:
schema:
object:
properties:
action: { type: string }
examples:
theBody:
value:
action: restore
获取特定备份(/foo/backups/{backupId}
)的请求:
paths:
/foo/backups/{backupId}:
get:
# restore the database from this backup
从REST的角度来看,这可能很好,原因如下:
/foo/backups/{backupId}
)不会被修改。但是我发现对于GET请求有非常强烈的副作用(恢复数据库)。
对特定备份(/foo/backups/{backupId}
)的POST(或PUT或PATCH)请求:
在最简单的情况下,我们不会发布任何内容。在其他情况下,我们可能会发布恢复注释或类似内容。
paths:
/foo/backups/{backupId}:
post:
# restore the database from this backup
在任何情况下,都不向备份发布任何内容或注释以触发还原。
引入restores
资源以进行操作:在这种情况下,/foo/restores/{backupId}
表示已执行的数据库还原的集合(例如,带有时间戳和注释)
paths:
/foo/restores/{backupId}:
post:
description: Adds a restore record to this restore collection
requestBody:
content:
application/json:
schema:
object:
properties:
comment: { type: string }
examples:
theBody:
value:
comment: Restored because of DB corruption after power failure.
看起来更合理,更RESTful,但这并不能真正让我感到满意。
在/foo/backups/{backupId}
上提供PATCH操作,以创建新资源-例如/foo/backups/{backupId}/restores/{restoreId}
paths:
/foo/backups/{backupId}:
patch:
description: Adds a restore record to the restores collection of this backup
requestBody:
content:
application/json:
schema:
object:
properties:
action: { type: string }
comment: { type: string }
examples:
theBody:
value:
action: restore
comment: Restored because of DB corruption after power failure.
对我来说,到目前为止,这似乎是一种非常合理的方法,但它看起来很像RPC,而不是RESTful。
在那里
答案 0 :(得分:1)
我认为您的很多选择都是可行的-请记住,没有一个适合所有解决方案的尺寸。
我个人认为,选项4 稍加改动将是理想的选择。可能会有些偏颇,但这就是我过去使用它的方式。
端点看起来像这样:
POST /foo/restores
请求正文将包含backup_id
。
因此:
GET /foo/restores
-返回所有还原记录。
GET /fee/restores/{restore_id}
-返回特定的还原记录。
我认为这是理想的选择,因为恢复(即恢复)和备份是两个具有各自属性的截然不同的操作,因此最好不要将它们相互嵌入。拥有两种不同的资源可以实现这一目标。