【问题标题】:how to properly set paginaging logic for data which come from multiple paginated api如何为来自多个分页 api 的数据正确设置分页逻辑
【发布时间】:2020-08-21 04:57:46
【问题描述】:

在我的 web api 项目中,我有 /search 端点来根据用户输入搜索学术出版物。我正在对该搜索 ep 中的四个不同 api 进行搜索调用。这四个api都有它们的分页机制。我无法为我的 /search ep 调用者创建分页逻辑。

如何从搜索 ep 中获取 pageSize 和 pageNumber 作为参数,并从这 4 个 api 返回 pageSize 项目的数量。我会从这 4 个 api 中获取所有项目,并在每次调用中返回 pageSize 项目的数量,但我不想在每次调用中从 api 中获取所有项目。

例如, 我收到这样的请求:

/seach?pageNumber=1&pageSize=30

我将在搜索功能中执行以下操作:

var apiResult1 = GetApiOneResult(); // apiResult1 = { page : 1, pageSize: 10, total: 100, data: [...] }
var apiResult2 = GetApiTwoResult(); // apiResult2 = {page: 1, pageSize: 10, total: 50, data: [...] }
var apiResult3 = GetApiThreeResult(); // apiResult3 = {page: 1, pageSize: 10, total: 0, data: null }

在上述场景中搜索将返回 20 个项目,因为我的 apiResult3 没有数据,但我想显示 30 个数据。我可以调用 apione 2nd page 并获得 10 多个项目。如果我在客户要求第二页 (/search?pageNumber=2&pageSize=30) 时这样做,我不应该调用 apiOne 的第二页,因为我已经在第一页中展示了这一点。

这只是一种情况,我可能需要考虑更多的事情。那么我怎样才能最好只在我的后端代码中实现这个分页问题呢?

我知道这不是一个具体问题,但任何代码示例或可能已经创建的设计模式都会对我有所帮助。

【问题讨论】:

  • @ryyker 我正在使用 C#,但语言并不重要。我需要逻辑方面的帮助
  • 如果 api 有分页逻辑,那么只需传递它们相同的内容,并在您的页面上分隔任何给定结果的来源。否则,您需要独立于您的页面跟踪每个源的分页状态,以便执行您想要的操作。
  • @RichardBarker 这就是我现在所做的,但在这种情况下,我无法在每个页面中显示相同数量的数据。

标签: c# algorithm api


【解决方案1】:

围绕每个源编写一个迭代器包装器。它会让一切变得简单。

在基本形式中,如果您从 api 获取页面,您可以将其存储在迭代器中并逐个返回项目。如果您用完了项目,您可以请求该来源的下一页。与源一起使用的页面大小仅与性能和内存使用有关,与最终结果无关。

您可以使用Enumerable.Concat 连接不同的迭代器,使它们看起来像一个列表。

然后您可以跳到元素(pageNumber - 1) * pageSize 并将pageSize 结果复制到您的输出中。您可以一一进行,因为底层迭代器将为您进行缓存/批处理。

为了加快速度,您可以尝试跳过部分以避免调用,或跳过多个项目。

注意:如果数据被冻结或很少更改,这会很好。如果在您转到下一页时它发生了变化,您可能会丢失项目或看到重复项。

【讨论】:

  • 我会试试的。我不想给我的前端一个复杂的 api。所以也许我会将分页信息存储在一个对象中并以base64字符串将其传递给前端,然后在第一页之后将此字符串作为参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 2023-04-06
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多