API
翻页
一条变更流上的不透明游标。上限是刻意的,而游标为 null 意味着追平,不意味着安全。
GET /v1/exposure 是唯一需要翻页的接口。
三个部件
| 部件 | 位置 | 说明 |
|---|---|---|
since | query 参数 | 上一个响应给的不透明游标。省略则从当前保留窗口的起点开始。最长 512 字符。 |
limit | query 参数 | 每页条数。最小 1,最大 200,默认 100。 |
next_cursor | 响应体 | 下一次调用作为 since 传回。追平时为 null。 |
循环
cursor := load_persisted_cursor() # 首次运行为 null
loop:
response := GET /v1/exposure?since=cursor&limit=100
if response.status != 200:
alert(); back off; retry # 不要推进游标
process(response.matches)
inspect(response.coverage_health)
if response.next_cursor == null:
persist(cursor); sleep; continue
cursor := response.next_cursor
persist(cursor)
只在这一页被持久地处理完之后才持久化游标。先存游标再崩溃,你就跳过了一页,而且没有任何东西会告诉你。
游标是不透明的
游标内容没有结构。不要解析、不要构造、不要按它排序。它不是时间戳,不是偏移量,它的格式不属于契约的一部分。
上限是刻意的
limit 上限为 200,因为这个接口是你自有地址簿的变更流,不是导出口。没有哪个页大小能把它变成导出口,也不存在别的接口、参数或格式能倾倒非终态的执法数据。
如果你发现自己想要一次全量,你真正想要的多半是持续运行的游标循环,再加上 GET /v1/coverage 来判断这份安静是不是真的。
next_cursor: null 不等于全清
它意味着你已经消费完当前可得的全部内容。它对「我们现在看不看得见」一字未提。在断定没事之前,先读同一个响应里的 coverage_health。