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

rmc*_*rry 5 rest

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

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

{ 
  group_id: "5t7yu8i9io0op",
  group_name: "That's my name",
  size: 34
}
Run Code Online (Sandbox Code Playgroud)

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

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

我很困惑!

提前致谢.

[编辑]

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

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

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

[第二次编辑]

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

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

Sat*_*ish 4

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