首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理长查询而不违反REST

问处理长查询而不违反REST
EN

Stack Overflow用户
提问于 2012-08-30 16:49:41
回答 4查看 272关注 0票数 2

我们有一个REST,我们在坚持REST精神方面做得很好。然而,我们有一个重要的用户,他们正在要求一种方法来协调他们的数据存储。流程的工作方式如下:

  1. 使用者进行GET调用,以检索在日期范围内创建的所有库存对象。让我们说,这将返回100万个库存VINs。
  2. 使用者将有效负载与他们自己的数据存储进行比较,请参阅它们丢失了5,000个库存对象
  3. 使用者希望使用5,000 VIN id发出请求,并返回这5,000个对象。

问题是长查询字符串(由vins组成的JSON数组)会碰到我们的服务器设置的查询字符串长度限制。拥有性的想法-进行5k的单独调用(似乎很可怕),增加服务器上的查询字符串长度限制(不想这样做),而使用POST (不是RESTful?)。

所以我想知道罗伊·菲尔丁会怎么做..。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-13 18:15:24

在没有创建资源的情况下使用帖子对我来说太脏了。最后,我们实现了这样一个限制,即在一个“块”中请求100个ids。在实践中,这些请求很少会超过100,因此,利用REST原则来容纳边缘情况似乎是个坏主意。我确保在API文档中清楚地定义了限制,完成和完成了.

票数 0
EN

Stack Overflow用户

发布于 2012-08-30 16:59:07

如果一个POST将带有id列表的JSON文件提交到一个新的资源,例如,名为/inventory/difference

如果计算时间太长,您可以使用202 Accepted和正在生成的资源id来回答,然后将其指向/inventory/difference/:id。

票数 3
EN

Stack Overflow用户

发布于 2012-09-13 18:59:14

这与moonwave99的建议有些相似,但是您创建了一个名为"set“的资源。

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

所以:

代码语言:javascript
复制
POST /set

结果:

代码语言:javascript
复制
301 Moved Permanently
Location: /set/123

然后:

代码语言:javascript
复制
GET /set/123

返回集合中的项列表。

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

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

然后,您可以使用:

代码语言:javascript
复制
GET /set/123/identifiers

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

你可以做这样的事

代码语言:javascript
复制
POST /setfromquery

并发送一份标准列表(如"John*“、city =”洛杉矶“等)。这实际上并不需要它自己的特定资源,只需定义您的查询“语言”,就可以包含简单的ID列表以及其他筛选条件。

设置操作(工会、差异等)。许多强大的事情可以用一个集合的资源来完成。

最后,当然,有一个永远流行的:

代码语言:javascript
复制
DELETE /set/123
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12201761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档