Clients JSON et applications monopages
Une requête avec l'en-tête Accept: application/json reçoit l'état de la file en JSON au lieu de la page d'attente. La valeur doit être exactement application/json : une liste comme application/json, text/plain reçoit la page HTML.
{
"error": "capacity overload",
"handler": "Loch.sh Queue Manager",
"detail": {
"position": 12,
"queueSize": 40,
"estimatedWaitTime": 5,
"refreshInterval": 20,
"progressPercentage": 70,
"debugInfo": ""
}
}
Le code est httpResponseCode (429 par défaut) et la réponse porte l'en-tête X-Loch-sh: Loch Queue. Quand le visiteur entre, la requête atteint le service normalement.
Gérer la file dans le client
- Envoyez les requêtes avec les cookies : le plugin identifie le visiteur par son cookie (
loch-queue-id). Le cookie estHttpOnly: le navigateur l'envoie, les scripts ne peuvent pas le lire. - Sur une réponse portant l'en-tête
X-Loch-sh, affichez la position et l'attente lues dansdetail. - Réessayez après
detail.refreshIntervalsecondes.
async function callApi(url) {
const res = await fetch(url, {
headers: {Accept: 'application/json'},
credentials: 'same-origin', // envoie le cookie de la file
});
if (res.headers.get('X-Loch-sh')) {
const body = await res.json();
if (body.detail) {
showQueue(body.detail.position, body.detail.estimatedWaitTime);
await new Promise((r) => setTimeout(r, body.detail.refreshInterval * 1000));
} else {
await new Promise((r) => setTimeout(r, 60_000)); // limite de débit
}
return callApi(url);
}
return res;
}
Bon à savoir
- Un client qui ne garde pas le cookie devient un nouveau visiteur à chaque requête, en fin de file, et atteint la limite de débit au bout de quelques requêtes.
- Une réponse sans
detailvient de la limite de débit, pas de la file. debugInfoest vide sauf si l'optiondebugest activée.
Détail des champs : Référence de la réponse JSON.