Где есть, а где нет#
| Метод | Пагинация | Почему |
|---|---|---|
| Торговые точки | есть | В крупном ТЦ их сотни |
| Продажи по дням | есть | Период может быть длиной в год |
| Чеки | есть | Десятки тысяч за месяц |
| Аномалии | есть | Растут вместе с периодом |
| Торговые центры | нет | Их у сотрудника единицы |
| Зоны подсчёта | нет | Их десятки, и список ограничен ТЦ |
| Продажи по месяцам | нет | Даже год — это 12 строк |
| Посещаемость | нет | Ограничена окном запроса |
| Настройки товарооборота | нет | Это один объект |
Отсутствие пагинации не упущение, а решение. Добавлять page туда, где список
физически не может быть большим, значит усложнять клиента без выгоды.
Как устроена#
GET /api/external/v2/sc/{sc_id}/shops?page=2&per_page=200| Параметр | По умолчанию | Диапазон |
|---|---|---|
page | 1 | от 1 |
per_page | зависит от метода | см. описание метода |
{
"success": true,
"data": [ ... ],
"meta": { "pagination": { "page": 2, "per_page": 200, "total": 431 } }
}В total приходит общее количество записей по заданному фильтру, а не размер страницы.
Число страниц считается как ceil(total / per_page).
Ключ называется total, а не total_items или count. Это одинаково во всех методах v2.
Обход целиком#
page, rows = 1, []
while True:
body = get(url, params={**filters, "page": page, "per_page": 500}).json()
rows += body["data"]
meta = body["meta"]["pagination"]
if page * meta["per_page"] >= meta["total"]:
break
page += 1per_page стоит брать побольше: один запрос на 500 строк дешевле по лимиту, чем пять по сто.
Максимумы у методов разные, они указаны в описании каждого.
Данные могут дописываться между запросами: чек, поступивший во время обхода, сдвинет границы страниц. Для точных выгрузок период стоит фиксировать датами: тогда набор строк не меняется по ходу обхода.