【发布时间】:2019-06-20 23:52:31
【问题描述】:
一个 REST 问题。假设我有一个数据库,其中包含一百万个项目。我想通过 REST GET 检索其中的 10,000 个,在 GET 请求中传递 10,000 个项目的 ID。使用 URL 请求查询参数,它会很快超过 URL 的最大长度。人们如何解决这个问题?改用 POST 并将其传递到正文中?这看起来很老套。
【问题讨论】:
一个 REST 问题。假设我有一个数据库,其中包含一百万个项目。我想通过 REST GET 检索其中的 10,000 个,在 GET 请求中传递 10,000 个项目的 ID。使用 URL 请求查询参数,它会很快超过 URL 的最大长度。人们如何解决这个问题?改用 POST 并将其传递到正文中?这看起来很老套。
【问题讨论】:
您不应通过 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
希望对你有帮助
【讨论】: