REST设计:应该使用什么Http动词来检索动态资源?

时间:2013-09-26 10:48:47

标签: rest

我有一个场景,我有REST API来管理我们称之为Group的资源。一个组包含成员,组资源是动态的 - 每当您检索它时,您将获得最新数据(因此查询必须运行服务器端以更新组中的成员数 - 换句话说,请求的结果是修改数据,因为存储了运行查询的结果。)

给定* group_id *它应该返回最少量的信息,如

{ 
  group_id: "5t7yu8i9io0op",
  group_name: "That's my name",
  size: 34
}

因此,对此资源的GET会导致资源发生变化,因为后续的GET可能会为“size”返回一个新值。这告诉我它不是幂等的,所以你应该使用POST来检索这个资源。我在这个结论中是否正确?

如果我是正确的,你认为提供一个只返回当前存储的数据的GET方法是明智的(例如,因此大小可能已经过时,甚至名称也是如此)。我想在这种情况下,我应该返回一个最后修改日期作为其中一个字段,以便用户知道资源是如何最新的,然后可以选择使用POST方法......但是我想知道为什么有人会这样做,为什么不提供POST方法而忘记GET?

我很困惑!

提前致谢。

[编辑]

@Satish在他/她对HTTP规范的回答中发布了一个链接。在第9.1.1节中。它以这句话结束:

  

当然,无法确保服务器不会因执行GET请求而产生副作用;实际上,一些动态资源会考虑这个功能。这里的重要区别是用户没有请求副作用,因此不能对他们负责。

所以在我的场景中,请求者并不真正关心副作用,即'size'的值被重新计算为发出请求的直接结果。他们想要组信息,只是为了提供准确的,最新的组数据,必须运行大小查询才能更新该值。虽然提出请求导致数据发生变化意味着这应该是一个POST,但是用户没有请求副作用,因此GET请求可以接受并且更直观,不是吗?因此根据这句话仍然是安宁的。

[第二次编辑]

@Satish在评论中提出了一个非常重要的问题。所以对于读过这篇文章的人我会进一步解释这个问题:

通常,您不会运行组查询以从REST请求更新其大小。在组中添加或删除成员时,您将更新该组的计算大小,存储它,然后一个简单的GET请求将始终返回正确的大小。但是,我们的情况更复杂,因为组只存储在ElasticSearch中的查询定义(有点像RDBMS中的视图)。成员不会在组中添加/删除。它们被添加到更大的数据集(MongoDB中的集合)。有数百个,可能有数千个不同的“组定义”,因此在集合更改时重新计算每个组的大小是不切实际的。我们无法知道何时在集合中添加/删除项目哪些组可能会更改大小 - 您只能通过运行该组中的组定义以及大小来知道。我希望能够解决问题。 :)

3 个答案:

答案 0 :(得分:4)

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

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

修改

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

GET - Requests data from a specified resource    
POST - Submits data to be processed to a specified resource

答案 1 :(得分:4)

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

答案 2 :(得分:-1)

这是GET和POST的结合。所以你应该使用POST。

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

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