5

我有一个场景,其中我有 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 中的集合)中。有成百上千个不同的“组定义”,因此当集合发生变化时重新计算每个组的大小是不切实际的。我们无法知道何时将项目添加到集合中/从集合中删除了哪些组可能会改变大小 - 您只能通过运行组定义知道谁在该组中以及大小是多少。我希望这能解决问题。:)

4

3 回答 3

4

在您的情况下,当您执行 a 时,您会GET检索有关 Group 的一些信息。您不修改组结构。好的,该组可以由外部实体更改,因此您的下一个 GET 可能会为您带来另一个数据。我对吗?谁修改了小组的结构以及何时修改?

因此,您应该使用GET它,因为它将从其他地方修改资源,而不是通过您尝试执行read operation.

编辑

在您编辑问题后,我只想补充一点,我同意副作用。如果您向服务器显式发送数据或更改命令, 或者您只是阅读某些内容并且您不必注意服务器端正在做什么来给您响应,这很重要。更直观:

GET - Requests data from a specified resource    
POST - Submits data to be processed to a specified resource
于 2013-09-26T11:15:12.483 回答
4

您应该使用 GET。即使动态资源正在更改,您也没有通过您的请求请求该更改,并且您不对该更改负责。参考:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

于 2013-09-26T11:23:18.123 回答
-1

它是 GET 和 POST 的组合。所以你应该使用POST。

参考:http ://adarshdchaurasia.wordpress.com/2013/09/26/http-get-vs-post/

您不应该使用 GET,因为如果您使用 GET 方法,那么搜索引擎可能会缓存响应。它可能会在您的服务器端导致无意的数据更新,这是您不希望的。GET 方法旨在返回内容而不更新服务器上的任何内容。POST 旨在更新服务器上的内容并针对该操作返回结果。

于 2013-09-26T10:54:58.350 回答