【问题标题】:REST Creating a resource at point-of-requestREST 在请求点创建资源
【发布时间】:2018-07-10 19:09:38
【问题描述】:

假设我需要公开一项服务,我可以在其中请求对特定时间范围内的用户进行分析(常见操作、活动、关系等)。 我会立即认为这是:

/users/{userId}/analyses - POST
/users/{userId}/analyses/{analysisId} - GET

这里的问题是“分析”资源从何而来——它本质上是基于请求的,因为它是执行这种复杂分析的服务,也是具有最新状态的服务的用户数据。简而言之,它在请求之前是不存在的。

我目前的想法是第一次请求分析的三个选项(检索相同):

/users/{userId}/analyses?from=2017-01-01&to=2018-01-01 - GET
/users/{userId}/analyses - POST { "from": "2017-01-01", "to": "2018-01-01" }
/users/{userId}/analyses?from=2017-01-01&to=2018-01-01 - POST

我喜欢带有查询参数的 GET,因为我正在请求资源,并确定要使用的用户数据的范围,直到我认识到资源可能在请求之间发生变化(基于后端的数据或处理逻辑)更改),并且我需要再次调用以发布此资源。

我喜欢带有请求正文的 POST,因为我希望创建一个资源,直到我认识到我已经转移的状态不是我稍后检索时会返回的状态,也不是它甚至是相同的超媒体类型。

我喜欢带有查询参数但没有正文的 POST,因为我正在创建一个资源并确定该资源的范围,但我仍在传输一个不是资源或结束媒体类型的状态,而且我已经看到几乎没有其他带有查询参数的 POST 示例。

任何人都以 RESTful 方式处理过这些类型的操作?

【问题讨论】:

    标签: rest http-headers httpverbs idempotent


    【解决方案1】:

    在我看来,使用GET /users/{userId}/analyses?from=...&to=... 是一个好方法。

    您请求analysis 类型的资源,这意味着您必须使用HTTP 动词GET。您传递参数以限制范围。资源可能在两个请求之间发生变化不是问题。您请求处于特定状态的资源,并且此状态可能会在您的 GET 请求之后立即更改。将此与允许其他客户端 POST 某事的集合资源进行比较。

    使用POST 意味着您希望客户使用所有必要的数据创建analysis 类型的资源,据我所知,这在您的情况下并不正确。在我看来,你自己对第二个和第三个例子的反驳是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      相关资源
      最近更新 更多