Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’API retourne 429 Too Many Requests lorsque votre application a envoyé plus de demandes que l’API l’autorise pendant une période donnée. La demande elle-même est correcte. Vous l’avez envoyé trop souvent, donc l’API l’a rejetée. Si vous attendez et l’envoyez à nouveau, cela fonctionne généralement. La réponse inclut souvent un Retry-After en-tête qui vous indique le temps d’attente. Pour plus d’informations, consultez RFC 6585, section 4.
À quoi ressemble un 429 dans les API populaires
Chaque API implémente des limites de débit différemment. Le code d’état, les en-têtes et le corps de l’erreur varient, de sorte que le code qui gère correctement une API peut mal gérer la suite.
| API | Status | Comment savoir combien de temps attendre | Attention à |
|---|---|---|---|
| GitHub |
403 ou 429 |
retry-after s’il est présent, sinon x-ratelimit-reset (secondes depuis l’époque Unix (UTC)) lorsque x-ratelimit-remaining est 0, sinon au moins 1 minute |
Un 403 peut être une limite de débit ou une autorisation manquante. Lisez les en-têtes pour les séparer. |
| OpenAI | 429 |
retry-after |
Quelque 429, comme credit_balance_exhausted, signifient que les nouvelles tentatives n’aideront pas. Vérifiez error.code. |
| Anthropic | 429 |
retry-after |
Une limite de dépense 429 n’a pas retry-after et continue à échouer jusqu’à ce que l’accès reprend. Une API surchargée retourne 529, et non 429. |
| Microsoft Graph | 429 |
Retry-After (secondes) |
Les limites diffèrent par service, par exemple SharePoint et Outlook. |
Comment gérer un 429
- Déterminez s’il faut réessayer ou non. Si l’erreur indique que votre quota, vos crédits ou votre limite de dépense sont utilisés, les nouvelles tentatives ne vous aideront pas. Indiquez à l’utilisateur et créez une alerte pour vous-même.
- Attendez tant que l’API vous demande. Si la réponse a
Retry-After, attendez ce temps. Il s’agit d’un nombre de secondes ou d’une date HTTP. Si l'API utilise des en-têtes de limite de débit à la place, comme ceux de GitHubx-ratelimit-reset, attendez jusqu'à l'heure de réinitialisation. - Sinon, reculez. Sans indication de l’API, réessayez avec un backoff exponentiel et une gigue aléatoire, puis arrêtez après quelques tentatives.
- Indiquez à l’utilisateur ce qui se passe. « Occupé, réessayer en 5 secondes » vaut mieux qu’un spinner interminable.
- Ralentissez avant la prochaine erreur 429. Si l’API envoie des en-têtes de limite de débit, utilisez le nombre restant pour adapter le rythme de vos requêtes.
async function fetchWithRetry(url, options, attempts = 3) {
for (let attempt = 1; ; attempt++) {
const response = await fetch(url, options);
if (response.status !== 429 || attempt === attempts) {
return response;
}
const retryAfter = response.headers.get('retry-after');
const waitMs = retryAfter
? (isNaN(retryAfter) ? new Date(retryAfter) - Date.now() : retryAfter * 1000)
: 2 ** attempt * 1000 + Math.random() * 1000;
await new Promise(resolve => setTimeout(resolve, Math.max(waitMs, 0)));
}
}
De nombreux SDK réessaient les erreurs 429 pour vous. Par exemple, le Kit de développement logiciel (SDK) OpenAI Python retente 2 fois par défaut, et le gestionnaire de résilience standard .NET retente 3 fois et respecte Retry-After. Lorsque le kit de développement logiciel (SDK) a épuisé toutes ses tentatives, votre code reçoit l’erreur, il faut donc toujours prévoir une solution de repli.
Comment tester que votre application gère 429
Vous voyez rarement un 429 pendant que vous développez. L’API est rapide, vous êtes le seul utilisateur et vos données de test sont petites. Ainsi, la façon dont vous testez la gestion 429 détermine si vous trouvez les bogues avant que vos utilisateurs ne le fassent.
| Approach | Ce que vous trouvez | Ce qui vous manque |
|---|---|---|
| Attendre la mise en production | Échecs réels | Tout, jusqu’à ce qu’un utilisateur le frappe |
| Simuler l’API dans vos tests ou laisser votre agent de codage écrire la simulation | Si votre branche de nouvelle tentative s’exécute | Les codes d’état réels, les en-têtes et les corps d’erreurs de l’API et la stratégie de nouvelle tentative de votre SDK. Votre application a également besoin d’un commutateur uniquement pour les tests afin d’accéder au mock. |
| Appelez l’API réelle jusqu’à ce qu’elle vous limite | Comportement réel | Vous ne pouvez pas déclencher de 429 à la demande, et vous épuisez votre quota réel |
| Interceptez le trafic réel de votre application et retournez des 429 à la demande | De vraies URL, votre véritable SDK et politique de nouvelle tentative, et le format 429 propre à l’API | Rien dans votre application ne change, de sorte qu’elle ne teste pas votre code de manière isolée. Conservez vos tests unitaires pour cela. |
Essayez-le dans votre application
Dev Proxy intercepte les demandes de votre application aux API que vous choisissez et retourne 429s, avec les propres en-têtes et le format d’erreur de l’API, tandis que votre application continue d’appeler les URL réelles. Il vous indique également quand votre application réessaie avant l’expiration du délai Retry-After.
Téléchargez le préréglage pour l’API appelée par votre application, puis démarrez le proxy de développement avec celui-ci :
devproxy config get github-rate-limiting
devproxy --config-file "~dataFolder/configs/github-rate-limiting/.devproxy/devproxyrc.json"
| API | Preset |
|---|---|
| GitHub | github-rate-limiting |
| OpenAI | openai-throttling |
| Anthropic | anthropic-throttling |
Microsoft Graph (OneDrive et SharePoint : /drive, /shares, /sites) |
microsoft-graph-rate-limiting |
Exécutez ensuite votre application comme d’habitude et regardez ce qu’elle fait. Pour installer Dev Proxy, consultez Configurer Dev Proxy.
Étapes suivantes
Voir aussi
- Qu’est-ce que la limitation du taux ?
- Qu’est-ce que le bridage ?
- Testez la façon dont votre application gère les limites de débit d’API GitHub
- Tester la façon dont votre application gère les limites de taux d’OpenAI
- Tester les nouvelles tentatives et les délais d’expiration dans les applications .NET