【问题标题】:Passing sizable data in an REST GET request在 REST GET 请求中传递大量数据
【发布时间】:2019-06-20 23:52:31
【问题描述】:

一个 REST 问题。假设我有一个数据库,其中包含一百万个项目。我想通过 REST GET 检索其中的 10,000 个,在 GET 请求中传递 10,000 个项目的 ID。使用 URL 请求查询参数,它会很快超过 URL 的最大长度。人们如何解决这个问题?改用 POST 并将其传递到正文中?这看起来很老套。

【问题讨论】:

    标签: rest get


    【解决方案1】:

    您不应通过 URL 参数处理此表单,它有一个限制:2000 个字符 Url limit

    我猜你在做什么是这样的:

    https://localhost/api/applicationcollections/(47495dde-67d2-4854-add0-7e25b2fe88e4,1b470799-cc8a-4284-9ca7-76dc34a5aebb)
    

    如果您计划获得超过 10k 条记录,您可以在没有任何限制的请求正文中传递信息。从技术上讲,您应该通过 POST 请求来执行此操作,但这不是 POST 动词语义的意图。即使对于 GET,您也可以包含正文:HTTP GET with request body,但不应将其视为语义的一部分。

    通常你不会按 id 过滤 10k 个元素,而是在请求中获得 10k 个元素,如果你想通过 URL 传递一个分页参数,但这可能会杀死你的应用程序,特别是考虑到 DTO 有超过一个字段,比如

    ApplicationDto
     field1
     field2....
     field15
    

    下面,你有一个如何传递分页参数并获取前 10k 条记录的示例

    https://localhost:44390/api/applications?pageNumber=1&pageSize=10000
    

    此外,API 应该返回一个额外的标头,我们称之为X-Pagination,如果您有更多页面要分页,您可以在其中获取信息,包括元素总数。

    作为减少请求大小的额外努力,您可以调整数据并仅获取您需要的字段。 ApplicationDto 应该只带:field1,field3 见下文:

    https://localhost:44390/api/applications?fields=field1,field3
    

    看看 Twitter 如何解决这个问题: Twitter cursor response

    希望对你有帮助

    【讨论】:

    • 谢谢,这有点帮助。但这很困难,因为在我们的应用程序中,这 10,000 个 ID 来自一个应用程序,并用于在不同的应用程序中检索数据。我现在倾向于做多个 REST GET,一次将其分成 100 个批次。对此也不是很满意。
    • @StefanEdlund 此应用程序是否通过 HTTP 发送 10k 条记录?立刻?有意义的是,您充当数据的代理或将这些记录转换为另一个输出。如果请求被中断会发生什么?您丢失了 10k 条记录,因为请求没有正确发送吗?
    • 另外,我的建议是在向 API 发布或读取数据时使用流
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 2019-09-07
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多