Rest 为长时间运行的创建过程推荐的工作流

Rest 为长时间运行的创建过程推荐的工作流,rest,api-design,Rest,Api Design,我正在设计一个RESTful API,它涉及客户端提交请求来创建一个资源,比如一个报告。出于不值得深入探讨的正当原因,此过程可能需要至少30秒,最多几分钟才能成功完成。我正在努力确保这个API是容易和直观的工作,所以我只想得到一些反馈,我想做什么 客户POSTs请求主体到/reports 服务器用202接受和Location:/jobs/{jobId}头进行响应 客户端GETs/jobs/{jobId}并接收200ok和响应体,如{“status”:“pending”}(缩写) 客户端重试,直到

我正在设计一个RESTful API,它涉及客户端提交请求来创建一个资源,比如一个报告。出于不值得深入探讨的正当原因,此过程可能需要至少30秒,最多几分钟才能成功完成。我正在努力确保这个API是容易和直观的工作,所以我只想得到一些反馈,我想做什么

  • 客户
    POST
    s请求主体到
    /reports
  • 服务器用
    202接受
    Location:/jobs/{jobId}
    头进行响应
  • 客户端
    GET
    s
    /jobs/{jobId}
    并接收
    200ok
    和响应体,如
    {“status”:“pending”}
    (缩写)
  • 客户端重试,直到获得
    200 OK
    (未更改)和类似
    {
    “状态”:“完成”,
    “位置”:“/reports/{reportId}”,
    详细信息“{…}”
    }
  • 客户端
    GET
    s
    /reports/{reportId}
    检索其报告
  • 我想做一些与上述不同的事情:

  • 拥有
    /jobs/{jobId}
    资源返回
    303请参阅其他
    位置:/reports/{reportId}
    准备就绪时标题。我看到的许多博客帖子和答案都采用了这种方法。我决定不使用这种方法,因为我们希望保留这些作业作为一流资源,例如,我们希望能够查看过去24小时内提交的所有作业,过去15分钟内失败的所有作业,等等。此外,
    303查看其他
    似乎真的不应该这样做返回一个主体,因为客户端应该重定向到
    位置
    url,这样他们无论如何都不会看到它
  • 让客户
    POST
    /jobs
    而不是
    /reports
    。我觉得这两种选择都是有道理的,但对于客户来说,如果他们想创建
    报告
    他们应该
    POST
    /reports
    ,这似乎就不那么令人惊讶了。也就是说,得到一个指向他们o用
    作业
    代替
    报告
  • 无论客户
    POST
    /reports
    还是
    /jobs
    ,由于我正在立即创建
    作业
    ,也许我应该返回
    201 Created
    ,而不是
    202 Accepted
  • 无论如何,这就是我目前的想法。任何确认、建议、尊敬地解释的分歧等都非常感谢

    谢谢

    我们希望将这些作业保留为一流资源,例如,我们希望能够查看过去24小时内提交的所有作业,以及过去15分钟内失败的所有作业,等等

    如果工作和报告都是一流的,那么我建议给它们一个通常显而易见的、枯燥的语义:

    • POST/jobs
      返回
      201 Created
      Location:/jobs/{id}
      头。毕竟,作业是立即创建的(报告为N/a)

      • 您也可以选择将此返回设置为
        ETag
        标题(参见下一步)
    • GET/jobs/{id}
      返回
      200ok
      ;响应主体指示报告的就绪状态以及(如果就绪)到
      /reports/{id}
      的URI

      • 如果没有匹配的话,您可以选择返回
        304 Not Modified
        ,直到就绪状态发生变化。当然,还可以返回
        ETag
        头,从而使该句柄
    • 当然,
      GET/reports/{id}
      是有效的



    p、 如果我没弄错的话,
    Location
    头应该是完整的URI,例如
    https://example.com/path/to/thing
    不仅仅是相对路径
    /path/to/thing
    。如果这样做,可能会对任何JSON响应
    location
    值执行类似操作?这样,客户端可以在发出请求时按原样使用这些值--w这对他们来说更方便,如果他们不硬编码协议/主机,对您来说也更好。

    我的第一个想法是利用Webhook或允许客户端传递回调url。此外,您是否考虑过允许客户端轮询报告/{reportid}/jobstatus?对我来说似乎更符合逻辑。@robertdraaisma
    /reports/{reportId}/jobstatus
    是一个有趣的想法,但是如果
    /reports/{reportId}
    尚未创建。我考虑过立即同步创建一个框架
    报表
    对象,该对象在报表准备好后立即填充,但我不希望客户端必须处理集合中两种不同的
    报表
    对象。关于:Webhooks/callback URL,我们仍然需要类似
    /jo的东西bs
    collection for monitoring&batch clients,无法使用这种推送方法。谢谢Greg。我认为你是对的。事实上,请求主体不是要持久化并添加到报告集合的报告表示形式,它包含系统需要执行大量计算以生成报告的数据,但是报告看起来一点也不像请求。因此,从工作的角度考虑更有意义,而报告是创建此工作的副作用。非常感谢!是的,我在上面很简短/草率,但将使用绝对URI作为位置。304/ETag有意义,但为了简单和优先级,我们可能会在后面添加。再次感谢!