【问题标题】:Designing a REST API endpoint that accepts a lot of data as input设计一个接受大量数据作为输入的 REST API 端点
【发布时间】:2014-05-09 09:08:12
【问题描述】:

假设我们正在设计 REST API。我们有一些实体,我们称之为foo

因此,返回根据某些谓词过滤的foo 实体列表的端点如下所示:

GET /foos?filtering-parameters-here

但问题是filtering-parameters 有效负载的大小可能非常巨大。在某些情况下,它可能很容易超过 6-7kb。

一些客户端(浏览器)正在修剪 URL,以防万一它是那个大小。

“明显”的解决方案是将其更改为POST 并在正文中发送参数。但这会使端点在语义上不干净。

那么正确的 RESTful 方式是什么?

【问题讨论】:

  • 主要基于意见?严重地?甚至-1。所以,我不明白你
  • 拆分你的 API,好像你需要 6KB 的参数来实现 GET,API 可能做的太多了......
  • @ircmaxell:在这种情况下不是 - 它们是实体列表的谓词过滤器。

标签: api rest


【解决方案1】:

我听说过在这种情况下使用POST 的建议,而不是仅仅接受参数。

相反,POST 请求以复杂的过滤数据作为消息体被触发,这可以预见地创建一个资源;让我们称之为search

POST /search HTTP/1.1

响应通过Location 标识结果集:

Location: http://example.com/search/798342

可以针对该位置发出后续GET 请求,并返回结果集。当结果集可能需要一些时间来生成(这可能是复杂过滤规则的情况)并保持与 HTTP 的预期一致时,这特别效果很好。 p>

GET /search/798342 HTTP/1.1

如果搜索结果还没有准备好,则产生一个404

搜索与其他任何事物一样,可以/应该表示为资源。另一个好处是缓存。如果您缓存复杂操作的结果,则可以从搜索结果集资源中传达缓存生命周期。

【讨论】:

  • 我使用这种模式的次数超出了我的想象。此外,还有很多扩展它的方法,例如:POST-ing 针对现有搜索创建子过滤器。
猜你喜欢
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多