【问题标题】:Creating/modifying a resource by sending a POST request to another (related) resource通过向另一个(相关)资源发送 POST 请求来创建/修改资源
【发布时间】:2016-11-29 07:41:42
【问题描述】:

我正在为测试和测试运行元数据设计一个 RESTful API。我有两个资源:TestTestRun。在后台,它们在数据库中具有一对一的关系。

首先我通过将POST 发送到api/v1/test 来创建Test 资源。

那么我必须开始这个测试。我通过向api/v1/test/{id}/run 发送POST 来做到这一点,这会创建一个与Test 资源相关的TestRun 资源。

然后我也可以通过向api/v1/test/{id}/finish 发送POST 来停止测试,这会修改相应的TestRun 资源(设置一些字段,例如finish_timeresult 等)。

API 的用户永远不会拥有GET 访问TestRun 资源的权限,只能通过其相关的Test 资源访问它们。

虽然这种设计对于 API 用户来说看起来非常简单,但我怀疑这对于开发人员来说也同样简单。我想出的这个设计够好吗?它是否违反任何 REST 原则或最佳实践?对此我将不胜感激。

整个 API 的扩展设计说明:https://gist.github.com/Ch00k/27724e29ec1bf044ebbfdabef9e842d5

【问题讨论】:

  • '我怀疑这对开发人员来说也很简单'。可能是什么问题?
  • @Lutz Horn 这显然是一个错误的问题 :) 我只是想知道我这样做是否是个好主意,以及它是否不违反 REST 最佳实践。

标签: rest api-design


【解决方案1】:

您的 API 不允许访问测试运行,因此测试运行似乎不是 REST 资源。事实上,就测试而言,您的 URL 是 REST 和 RPC(尤其是 /run/finish 路径)的混合体。

RPC 不是 REST,所以我会稍微修改一下:

  • 仅使用 一种 类型的资源,即测试,位于api/v1/test/{id}
  • 测试具有可以使用GET 请求api/v1/test/{id} 检索的状态:
    • status: stopped, started, finished, ...
    • finish_time
    • result
    • ...
  • 使用PATCH 请求将测试的状态更改为api/v1/test/{id},并使用包含新状态的 JSON 正文:{"status": "started"} 来启动测试等。这将替换 RPC 调用。

【讨论】:

  • 您还会保留现有的数据库设计吗? IE。我仍然会有一个 Test 表和一个 TestRun 表,当我向 api/v1/test/{id} 发出 PATCH 请求时,会更改 TestRun 表中的记录。请注意,在我的设计中,测试本身没有状态,但它的状态由其 TestRun 的 start_time 和 end_time 定义。
  • 我实际上会添加一个状态字段,因为它使查询更容易。
  • REST 与你持久化资源无关。一个资源可以存储在多个表中。
猜你喜欢
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2022-07-28
相关资源
最近更新 更多