2

我们有一个 REST api,我们在坚持 REST 精神方面做得很好。但是,我们有一个重要的消费者,他们正在请求一种方法来协调他们的数据存储。流程是这样的:

  1. 消费者进行 GET 调用以检索在日期范围内创建的所有库存对象。假设这会返回 100 万个库存 VIN。
  2. 消费者将有效负载与他们自己的数据存储进行比较,发现他们缺少 5,000 个库存对象
  3. 消费者希望使用 5,000 个 VIN id 发出请求,并返回这 5,000 个对象。

问题是长查询字符串(vins 的 JSON 数组)碰到了我们服务器施加的查询字符串长度限制。可能的想法 - 进行 5k 单独调用(看起来很可怕),增加服务器上的查询字符串长度限制(不想这样做),改用 POST(不是 RESTful?)。

所以,我想知道罗伊菲尔丁会做什么......

4

4 回答 4

3

POST带有 id 列表的 JSON 文件提交到新资源(例如,称为 )/inventory/difference怎么样?

如果计算持续很长时间,您可以使用202 Accepted和正在生成的资源的 id 来回答,然后在/inventory/difference/:id.

于 2012-08-30T16:59:07.357 回答
2

有点类似于 moonwave99 的建议,但是您创建了一个称为“集合”的资源。

你 POST 到 /set 一个你希望在集合中的标识符列表。POST 的结果是指向指定特定集合的资源的重定向 URL。

所以:

POST /set

结果:

301 Moved Permanently
Location: /set/123

然后:

GET /set/123

返回集合中的项目列表。

集合与“获取差异”的用例正交,它们只是项目的汇编。

如果创建集合需要很长时间,并且您认为集合本身是数据的快照,那么当用户尝试执行 GET /set/123 时,可以简单地回复 202 Accepted 直到实际数据集已完成完全的。

然后你可以使用:

GET /set/123/identifiers

例如,如果您愿意,可以获取集合中实际标识符的集合。

你可以做类似的事情

POST /setfromquery

并发送标准列表(名称如“John*”、city =“Los Angeles”等)。这实际上并不需要它自己的特定资源,只需定义您的查询“语言”以包括简单的 ID 列表以及可能的其他过滤条件。

集合操作(​​联合、差异等)。使用一组资源可以完成许多强大的事情。

最后,当然,还有曾经流行的:

DELETE /set/123
于 2012-09-13T18:59:14.717 回答
1

我认为没有人会指责您通过使用 POST 处理需要请求正文的请求来解决 GET 不接受请求正文的问题。你只是务实。

我同意,提出 5000 个单独的请求或提高查询字符串限制是丑陋的。POST是前进的方向。

于 2012-08-30T17:04:04.277 回答
0

在不创建资源的情况下使用帖子对我来说似乎太脏了。最后,我们做到了,“块”中请求的 id 限制为 100 个。在实践中,这些请求很少会大于 100,因此破解 REST 原则来适应边缘情况似乎是个坏主意。我确保在我们的 API 文档中明确定义了限制,完成并完成......

于 2012-09-13T18:15:24.930 回答