我有一个场景,其中我有 REST API 来管理我们将称为组的资源。组包含成员并且组资源是动态的 - 每当您检索它时,您都会获得最新数据(因此查询必须在服务器端运行以更新组中的成员数量 - 换句话说,请求的结果是修改数据,因为运行查询的结果被存储)。
给定一个 *group_id* 它应该返回最少量的信息,例如
{
group_id: "5t7yu8i9io0op",
group_name: "That's my name",
size: 34
}
因此,对该资源的 GET 会导致资源发生更改,因为后续 GET 可能会为“大小”返回一个新值。这告诉我它不是幂等的,因此您应该使用 POST 来检索此资源。我的这个结论正确吗?
如果我是正确的,您是否认为还提供一个仅返回组当前存储的数据的 GET 方法是否可取(例如,大小可能已过时,甚至名称也可能过时)。我想在这种情况下,我应该将最后修改日期作为字段之一返回,以便用户知道资源的最新程度,然后可以选择使用 POST 方法……但后来我想知道为什么有人会这样做,那么为什么不只提供 POST 方法而忘记 GET 呢?
我很困惑!
提前致谢。
[编辑]
@Satish 在他/她对 HTTP 规范的回答中发布了一个链接。在第 9.1.1 节中。它以这句话结尾:
当然,不可能确保服务器不会因为执行 GET 请求而产生副作用;事实上,一些动态资源认为这是一个特性。这里的重要区别是用户没有请求副作用,因此不能对它们负责。
所以在我的场景中,请求者并不真正关心“大小”的值被重新计算为发出请求的直接结果的副作用。他们想要组信息,而恰好为了提供准确、最新的组数据,必须运行大小查询才能更新该值。虽然发出请求会导致数据更改意味着这应该是一个 POST,但用户没有请求这种副作用,因此 GET 请求是可以接受的并且更直观,不是吗?所以照着这句话还是要安息。
[第二次编辑]
@Satish 在评论中提出了一个非常重要的问题。因此,对于阅读本文的其他人,我将进一步解释这个问题:
通常,您不会运行组查询来从 REST 请求更新其大小。在组中添加或删除成员时,您将更新该组的计算大小、存储它,然后一个简单的 GET 请求将始终返回正确的大小。但是,我们的情况更复杂,因为组仅作为查询定义存储在 ElasticSearch 中(有点像 RDBMS 中的视图)。成员不会被添加到组或从组中删除。它们被添加到更大的数据集(MongoDB 中的集合)中。有成百上千个不同的“组定义”,因此当集合发生变化时重新计算每个组的大小是不切实际的。我们无法知道何时将项目添加到集合中/从集合中删除了哪些组可能会改变大小 - 您只能通过运行组定义知道谁在该组中以及大小是多少。我希望这能解决问题。:)