Lots
Traiter une liste d'entrées en respectant le débit par minute et les délais de réessai.
/
Ce qui est servi
Ces opérations se lancent sur une liste d'entrées en un appel : Annonce par lien ou identifiant, en lot, Lots d'un immeuble établis par ses DPE, Indice Travaux et état du parc en vente, en lot, Baromètre, en lot.
Une liste, appel par appel
- Restez sous le débit par minute de votre organisation :
RateLimit-Remainingdit ce qui reste dans la minute,RateLimit-Resetdans combien de secondes elle repart. - Sur une réponse 429 ou 503, attendez le délai de
Retry-Afteravant de renvoyer. - Une réponse identique à une réponse déjà servie dans les 24 h n'est pas débitée une seconde fois : relancer une liste interrompue ne paie pas deux fois ce qui est déjà servi.
// Un appel à la fois : on respecte le débit par minute et le délai de réessai.
async function appeler(url, options, essais = 3) {
for (let i = 0; i < essais; i++) {
const reponse = await fetch(url, options)
if (reponse.status !== 429 && reponse.status !== 503) return reponse
const attente = Number(reponse.headers.get("Retry-After") ?? 1)
await new Promise((fin) => setTimeout(fin, attente * 1000))
}
throw new Error("toujours refusé après plusieurs essais")
}
const urls = ["https://pillr.fr/api/v1/communes/76540"]
for (const url of urls) {
const reponse = await appeler(url, { headers: { Authorization: `Bearer ${process.env.PILLR_CLE}` } })
const donnees = await reponse.json()
// ... traiter donnees ...
if (reponse.headers.get("RateLimit-Remaining") === "0") {
const reprise = Number(reponse.headers.get("RateLimit-Reset") ?? 1)
await new Promise((fin) => setTimeout(fin, reprise * 1000))
}
}Guide suivant : Asynchrone et webhooks