Comenzar
Paginación y rangos de tiempo
Cómo devuelven los resultados por páginas las operaciones de lista de Rhombus: cursores lastEvaluatedKey, tokens de página, cursores de marca de tiempo y ventanas de tiempo, con ciclos en Python y JavaScript y los errores que hacen perder o duplicar resultados.
En esta página
Esta página se tradujo automáticamente. Si encuentras errores o tienes sugerencias, escríbenos.
Las operaciones que pueden devolver muchos resultados los paginan con uno de varios estilos. La página de cada operación en la referencia de la API (en inglés) muestra qué campos recibe; esta página explica cómo funciona cada estilo.
| Estilo | Campos de la solicitud | Campo de la respuesta | Última página cuando |
|---|---|---|---|
| Cursor | maxPageSize, lastEvaluatedKey (a veces dentro de pageRequest) | lastEvaluatedKey | Falta lastEvaluatedKey |
| Token de página | pageSize, pageToken | pageToken | Falta pageToken |
| Cursor de marca de tiempo | maxPageSize, pageTimestampMs | lastEvaluatedTimestampMs | Falta lastEvaluatedTimestampMs |
| Ventana de tiempo | createdAfterMs, createdBeforeMs, limit | ninguno | Una página trae menos de limit eventos |
| Último elemento | maxResults, lastTimestampMs, lastUuid | ninguno | Una página llega vacía |
Todas las marcas de tiempo son milisegundos de época Unix.
Páginas con cursor
La mayoría de las operaciones de lista reciben maxPageSize y lastEvaluatedKey, y devuelven lastEvaluatedKey mientras quedan resultados. Envíalo sin cambios para obtener la página siguiente; cuando la respuesta no trae lastEvaluatedKey, ya tienes todo. Por ejemplo, findAccessControlledDoors:
import os
import requests
URL = "https://api2.rhombussystems.com/api/component/findAccessControlledDoors"
HEADERS = {"x-auth-scheme": "api-token", "x-auth-apikey": os.environ["RHOMBUS_API_KEY"]}
doors, key = [], None
while True:
body = {"maxPageSize": 100}
if key:
body["lastEvaluatedKey"] = key
page = requests.post(URL, headers=HEADERS, json=body).json()
if page.get("error"):
raise RuntimeError(page.get("errorMsg"))
doors += page.get("accessControlledDoors", [])
key = page.get("lastEvaluatedKey")
if not key:
breakconst url = "https://api2.rhombussystems.com/api/component/findAccessControlledDoors";
const headers = {
"x-auth-scheme": "api-token",
"x-auth-apikey": process.env.RHOMBUS_API_KEY,
"Content-Type": "application/json",
};
const doors = [];
let key;
do {
const body = { maxPageSize: 100, ...(key && { lastEvaluatedKey: key }) };
const page = await (await fetch(url, { method: "POST", headers, body: JSON.stringify(body) })).json();
if (page.error) throw new Error(page.errorMsg);
doors.push(...(page.accessControlledDoors ?? []));
key = page.lastEvaluatedKey;
} while (key);Algunas operaciones anidan esos dos campos en un objeto pageRequest ({"pageRequest": {"maxPageSize": 100, "lastEvaluatedKey": "…"}}) y devuelven lastEvaluatedKey en el nivel superior de la respuesta.
- Sigue hasta que falte
lastEvaluatedKey. Una página puede traer menos resultados quemaxPageSize, o ninguno, aunque queden más: los resultados que no puedes ver se eliminan después de leer la página. - Indica siempre
maxPageSize. Sin él, algunas operaciones devuelven todos los resultados en una sola respuesta y otras aplican su propio valor predeterminado. Cada operación tiene su propio máximo, y un valor mayor se rechaza con400. - Trata
lastEvaluatedKeycomo opaco. No lo construyas, edites ni guardes a largo plazo. Un valor que el servidor no puede leer no se rechaza: la operación vuelve a empezar desde la primera página. - Mantén iguales los demás campos en todas las páginas de un mismo listado.
Tokens de página
Algunas operaciones, como getClipsWithProgress, usan pageSize y pageToken. Envía el pageToken de cada respuesta en la solicitud siguiente y detente cuando la respuesta no lo incluya. En getClipsWithProgress, pageSize va de 1 a 200 y su valor predeterminado es 100.
Cursores de marca de tiempo
getSavedClipsV2 devuelve lastEvaluatedTimestampMs. Envíalo como pageTimestampMs en la solicitud siguiente y detente cuando la respuesta no lo incluya. Indica maxPageSize; su valor predeterminado es 100. Igual que con los cursores, una página puede ser corta aunque queden más clips.
Ventanas de tiempo
El historial de eventos de puertas y sensores, como findComponentEventsByAccessControlledDoor, recibe una ventana y una cantidad en lugar de un cursor:
createdAfterMsycreatedBeforeMsdelimitan la ventana.createdBeforeMses exclusivo.limitlimita la cantidad de eventos, empezando por los más recientes. Indícalo: sinlimit, todos los eventos de la ventana llegan en una sola respuesta.
Para leer más atrás, repite la solicitud con createdBeforeMs igual a un milisegundo después del evento más antiguo que recibiste, y descarta por su UUID los eventos que ya tienes. Mover el límite exactamente a la marca de tiempo más antigua puede omitir eventos que comparten ese milisegundo.
Alertas de políticas
getPolicyAlerts devuelve las alertas de la más reciente a la más antigua, hasta maxResults, sin cursor en la respuesta. Para la página siguiente, envía el timestampMs y el uuid de la última alerta recibida como lastTimestampMs y lastUuid, con los mismos filtros y la misma ventana (afterTimestampMs, beforeTimestampMs). Detente cuando una página llegue vacía o cuando alcances el inicio de tu ventana.
Elegir el tamaño de página
Las páginas más grandes implican menos solicitudes contra tu límite de tasa, pero respuestas más lentas. Para sincronizar por completo una organización grande, usa el tamaño más grande que acepte la operación y continúa el ciclo hasta la condición de última página de la tabla anterior.