如何对海康威视API的结果进行分页?

后端开发 2026-07-10

我正在通过海康威视门禁系统进行集成:

/AccessControl/AcsEvent?format=json

使用 AcsEventCond

我需要在多次请求中实现增量获取事件。

我当前的方法使用序列边界:

{
  "beginSerialNo": lastSerial,
  "endSerialNo": lastSerial + 29,
  "maxResults": 30,
  "major": 0,
  "minor": 0
}

然后我收集返回的 serialNo 值,并假设它们是连续的,因此像这样检测到间隙:

$expected = range($startSerial, $maxRetrieved);
$missing = array_diff($expected, $retrieved);

但实际情况是API返回的序列号并非连续,例如:

1001, 1002, 1004, 1005

所以我的实际问题是:

当返回的 serialNo 值不连续时,继续分页/增量检索的正确做法是什么?

更具体地说:

  • 下一次请求应该从 max(returned serialNo) + 1 开始吗?
  • 还是应该完全避免基于序列号的续传,改为使用 searchResultPosition 或基于时间的查询?

当ID稀疏时,客户端代码中哪种续传逻辑才是正确的?

解决方案

分页的正确方式是通过maxResults和 startIndex。你将使用一个固定的最大结果数进行循环,并不断增加startIndex,直到返回NO MATCH,表示没有更多数据。序列号在时间上会重叠,因为一旦设备达到最大事件容量,序列号就会从1 重新开始,这在之前的情形中是不同的。此外,很多序列号是内部使用的,这也是你看到间隙的原因。如果需要对事件排序,请使用eventtime。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章