如何在无限数量的参数上进行RESTful GET?

时间:2015-05-18 22:33:24

标签: json rest post get

我有一组RESTful资源的ID(所有相同类型的资源),其数量可以无限大。我想进行REST调用以获取这些资源的名称。像这样:

发送:

['005fc983-fe41-43b5-8555-d9a2310719cd', '4c6e6898-e519-4bac-b03e-e8873d3fa3f0',...]

接收:

['Resource A', 'Resource B',...]

RESTful地检索这些资源名称的最佳方法是什么?

以下是我所拥有的想法以及我在每种方法中遇到的问题:

  • 天真的方法是迭代我的集合中的所有ID,并为每个ID执行'GET / resource /:id'。由于我必须进行大量的HTTP调用,这将非常缓慢且资源密集。
  • 我想到的下一个方法是将ID作为参数传递给单个GET调用。这里的问题是大多数服务器都限制了URL长度,这很快就会超出。
  • 接下来,我认为将ID放在GET正文中会有效,但根据Roy Fielding的说法,GET正文中的数据不应影响REST调用的结果:HTTP GET with request body
  • 我可以使用POST请求并将数据放在POST主体上,但POST用于创建和修改资源,这不是我正在做的事情。也许我应该忽略动词的意图并使用它呢?
  • 我可以将请求拆分为多个GET请求,以避免超出最大URL长度。这里的问题是我必须在所有调用返回后合并结果,这可能很慢。
  • 我可以通过将我的ID列表发布到'POST / resource / collection',在我的主资源中创建一个集合资源,然后使用'GET / resource / collection /:id'调用来检索结果。这实际上有效,但后来我必须做一个'DELETE / resource / collection /:id'来清理。它需要多次通话,需要清理,整体看起来有点笨重,所以没关系,但不理想。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

你最后的方法是RESTful和我推荐的方法。我这样做:

第1步:

请求:

POST /resource/collection
Content-Tpye: application/json

{
  "ids": [
    "005fc983-fe41-43b5-8555-d9a2310719cd",
    "4c6e6898-e519-4bac-b03e-e8873d3fa3f0"
  ]
}

响应:

201 Created
Location: /resource/collection/89AB8902-FDF1-11E4-ADDF-CD4FB664A5DC

第2步:

请求:

GET /resource/collection/89AB8902-FDF1-11E4-ADDF-CD4FB664A5DC

响应:

200 OK
Content-Type: application/json

{
  "resources": [ ... ]
}
  

然后我必须做一个' DELETE / resource / collection /:id'清理。

不,这不是必要的。服务器可以实现一个作业,删除所有早于特定时间戳的集合。客户不是必须这样做的。

如果稍后客户端再次访问该集合,服务器将以

响应
410 Gone