【问题标题】:How to paginate Trello api response?如何对 Trello api 响应进行分页?
【发布时间】:2016-04-09 08:26:06
【问题描述】:

我正在使用 Trello 的 API 来拉取看板和卡片。

我注意到我正在拉的其中一个板目前接近千张卡,所以我想知道如何对结果进行分页?

我尝试使用since 属性并将最后一张卡片的更新时间输入其中,但之后我得到零结果,所以我一定做错了什么。

api文档说的不多,我试过的api响应也很混乱:

/boards/xyz/cards?limit=1&before=2015-1-1

返回活动在指定日期之后的卡片。

"dateLastActivity"=>"2015-02-03T17:51:23.253Z",

我没有其他日期字段可以用来继续分页。

【问题讨论】:

  • 阅读此之前 问:stackoverflow.com/help/mcve 您必须提供您的工作示例。我认为您需要自己进行分页,API 会返回所有值。 since 属性我找不到。我在卡片和列表中找到了filter,但用于另一项任务。

标签: trello


【解决方案1】:

​您的评估是正确的。 beforesince 参数在卡片创建日期起作用。因为我们使用标准的 Mongo ID,所以您实际上可以从 Card ID 中推导出 Card 创建日期。 (这是一个这样的工具:https://steveridout.github.io/mongo-object-time/

​ ​为方便起见,Trello 还允许您将卡片 ID 传递给 beforesince 参数,我们将为您使用日期。推荐的翻阅大量卡片的方法是重复相同的查询,并使用这些参数向前或向后移动。

【讨论】:

  • 太棒了,非常感谢。现在,如果您也可以在您的文档中为其他人记录它,那就太棒了:)
  • 我只是尝试使用单张卡的 id 作为前后的参数,并且响应真的很奇怪。前后都返回了不同的卡,但他们也共享一张卡(不是作为参数的卡)。我已经通过电子邮件发送了支持,但也许您可以编写一份真实的文档,以便每个人都可以受益。
【解决方案2】:

因此,由于 API 确实无法像您期望的那样工作,因此我至少在这里记录了这一点。

我创建了一个带有卡ABC、...、M 的测试板,因此我可以对其进行测试。

首先,按预期抓取所有卡片。

api.find(:boards, '56af532ae7a74a5fcac32e66').cards.map { |c| [c.name, c.id] }

=> [
 ["A", "56af53367f15b163c0e345fd"],
 ["B", "56af533783d4fccc1cce3941"],
 ["C", "56af533831727db409451c9e"],
 ["D", "56af53397bf672bb56c7c536"],
 ["E", "56af5339f5e67cf6bcc7323b"],
 ["F", "56af533ac0aa02de54ab881a"],
 ["G", "56af533b212b095266ebb506"],
 ["H", "56af533e11992f20f375fca1"],
 ["I", "56af533fc1775129aaa7028b"],
 ["J", "56af5345f81227a7a1cc3a35"],
 ["K", "56af5345e36b3d3c45b16967"],
 ["L", "56af534d964b6c4aa93d4aca"],
 ["M", "56af534e768610ff67c781ce"]
]

注意:卡片的顺序不是按创建时间,而是按照它们在棋盘中的出现顺序从左列到右列,从上到下。

限制

好的,是时候开始分页了。我们只拿第一张卡,好吗?

board.cards(limit: 1).map { |c| [c.name, c.id] }

=> [["M", "56af534e768610ff67c781ce"]]

糟糕,API 返回最后一个元素。绝对出乎意料。让我们玩下一个之后/之前。

之前

让我们在最后一张之前抢卡。

board.cards(limit: 1, before: '56af534e768610ff67c781ce').map { |c| [c.name, c.id] }

=> [["L", "56af534d964b6c4aa93d4aca"]]

效果很好,LM 之前。

之后

如果我们在最后一张卡片之后抓到一张卡片会发生什么,响应应该是空的,对吧?

board.cards(limit: 1, after: '56af534e768610ff67c781ce').map { |c| [c.name, c.id] }

=> [["M", "56af534e768610ff67c781ce"]]

嗯,什么?如果我抓到两张卡会怎样?

board.cards(limit: 2, after: '56af534e768610ff67c781ce').map { |c| [c.name, c.id] }

=> [
  ["L", "56af534d964b6c4aa93d4aca"], 
  ["M", "56af534e768610ff67c781ce"]
]

这违背了任何逻辑。那肯定不能从头到尾遍历列表,因为卡片列表没有尽头。

返回分页

在这种情况下,我们必须以相反的顺序检查卡片。只需指定limit 即可,因为默认情况下我们会以相反的顺序进行。 (这完全有道理,对吧?)

api.find(:boards, '56af532ae7a74a5fcac32e66').cards(limit: 5).map { |c| [c.name, c.id] }

=> [
 ["I", "56af533fc1775129aaa7028b"], 
 ["J", "56af5345f81227a7a1cc3a35"], 
 ["K", "56af5345e36b3d3c45b16967"], 
 ["L", "56af534d964b6c4aa93d4aca"], 
 ["M", "56af534e768610ff67c781ce"]
]

不要让这些物品的顺序欺骗了您!它仍然是它们在董事会中出现的顺序,它们没有按创建时间排序。如果我在其列中移动M 卡片使其正好位于L 上方,API 将以相反的顺序返回它们。

现在的问题是,如何从列表中获取旧卡?正如另一个答案所说,ID 是时间戳,因此我们只需按 ID 排序并选择最低的一个并继续分页。

注意:如果您速度很快,您可以在同一秒内创建多张卡片,因此 ID 的顺序可能不正确,因为它们只使用秒数,而不是微秒。但这并不妨碍我们分页。

board.cards(limit: 5, before: '56af533fc1775129aaa7028b').map { |c| [c.name, c.id] }

=> [
  ["D", "56af53397bf672bb56c7c536"], 
  ["E", "56af5339f5e67cf6bcc7323b"], 
  ["F", "56af533ac0aa02de54ab881a"], 
  ["G", "56af533b212b095266ebb506"], 
  ["H", "56af533e11992f20f375fca1"]
]

太棒了,我们正在获取下一页,让我们获取最后一页。

board.cards(limit: 5, before: '56af53397bf672bb56c7c536').map { |c| [c.name, c.id] }

=> [
  ["A", "56af53367f15b163c0e345fd"],
  ["B", "56af533783d4fccc1cce3941"],
  ["C", "56af533831727db409451c9e"]
]

是的,所以最后一页包含的卡片少于限制,所以我们知道它是最后一页。万岁! (如果它等于页面大小,我们会发现下一个响应是空的)

【讨论】:

  • 这适用于小集合,但有 1000 个操作限制。如果你限制为 500,那么 page=0 很好,page=1 很好......但是 page=2 会抛出一个错误,说你请求 1500 并且限制是 1000。这意味着你需要分页,因为/在对/范围之前。这完全违反了分页的工作原理。
  • 您是要回复这个答案吗?我根本不使用分页,并在其中使用自/之前。
  • 我误读了最后一个 sn-p,我的错误 - 没有注意到您更改了之前的 Trello ID。你是对的,你必须使用之前“向后”处理它们。我解决这个问题的方法是一起使用之前和之后。所以我将“since”保持为零,然后在运行后存储“since=56af533e11992f20f375fca1”(H)。在下一次通过时,我会使用“水印”作为“since”以及“before”方法,您在上面概述的分页。
猜你喜欢
  • 2016-12-15
  • 2015-09-24
  • 2021-09-09
  • 2017-11-28
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
相关资源
最近更新 更多