用于备份和还原的RESTful API

时间:2019-01-25 06:52:14

标签: rest api-design hateoas

我将设计一个RESTful API来备份和还原数据库。

我想知道是否存在一种RESTful且合理的方法...

API应该支持3种操作:

  1. 进行备份。
  2. 列出可用备份(主要用于选择要还原的备份)。
  3. 从特定备份中还原。

前两个看起来很简单:

paths:
  /foo/backups:
    post:
      # create a backup
  /foo/backups:
    get:
      # list available backups

但是如何从备份还原呢?

我看到了一些选择-到目前为止,没有一个让我真正满意的:

  1. 忘记REST并通过HTTP进行RPC。就像

    一样
    paths:
      /foo/backups/{backupId}:
        post:
          requestBody:
            content:
              application/json:
                schema:
                  object:
                    properties:
                      action: { type: string }
                examples:
                  theBody:
                    value:
                      action: restore
    
  2. 获取特定备份(/foo/backups/{backupId})的请求:

    paths:
      /foo/backups/{backupId}:
        get:
          # restore the database from this backup
    

    从REST的角度来看,这可能很好,原因如下:

    • 资源(/foo/backups/{backupId})不会被修改。
    • 该运算是幂等的

    但是我发现对于GET请求有非常强烈的副作用(恢复数据库)。

  3. 对特定备份(/foo/backups/{backupId})的POST(或PUT或PATCH)请求:

    在最简单的情况下,我们不会发布任何内容。在其他情况下,我们可能会发布恢复注释或类似内容。

    paths:
      /foo/backups/{backupId}:
        post:
          # restore the database from this backup
    

    在任何情况下,都不向备份发布任何内容或注释以触发还原。

  4. 引入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,但这并不能真正让我感到满意。

  5. /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。

在那里

  • 更好方法的想法
  • 为什么我建议的一个比其他的要好
  • 应该考虑的任何遗漏方面吗?

1 个答案:

答案 0 :(得分:1)

我认为您的很多选择都是可行的-请记住,没有一个适合所有解决方案的尺寸。

我个人认为,选项4 稍加改动将是理想的选择。可能会有些偏颇,但这就是我过去使用它的方式。

端点看起来像这样:

POST /foo/restores

请求正文将包含backup_id

因此:

GET /foo/restores-返回所有还原记录。

GET /fee/restores/{restore_id}-返回特定的还原记录。

我认为这是理想的选择,因为恢复(即恢复)和备份是两个具有各自属性的截然不同的操作,因此最好不要将它们相互嵌入。拥有两种不同的资源可以实现这一目标。