Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine API gibt 429 Too Many Requests zurück, wenn Ihre App mehr Anfragen gesendet hat, als die API in einem bestimmten Zeitraum zulässt. Die Anforderung selbst ist in Ordnung. Sie haben sie zu oft gesendet, sodass die API sie abgelehnt hat. Wenn Sie warten und es erneut senden, ist es in der Regel erfolgreich. Die Antwort enthält häufig einen Retry-After Header, der Ihnen angibt, wie lange gewartet werden soll. Weitere Informationen finden Sie unter RFC 6585, Abschnitt 4.
Wie ein HTTP-Statuscode 429 in beliebten APIs aussieht
Jede API implementiert Ratenbegrenzungen unterschiedlich. Der Statuscode, die Header und der Fehlertext variieren alle, sodass Code, der eine API ordnungsgemäß verarbeitet, die nächste falsch behandeln kann.
| API | Status | Wie man bestimmt, wie lange gewartet werden muss | Achten Sie auf |
|---|---|---|---|
| GitHub |
403 oder 429 |
retry-after, wenn vorhanden, andernfalls x-ratelimit-reset (UTC-Epochen-Sekunden), wenn x-ratelimit-remaining0 ist, andernfalls mindestens 1 Minute |
403 kann eine Ratenbegrenzung oder eine fehlende Berechtigung sein. Lesen Sie die Kopfzeilen, um sie zu unterscheiden. |
| OpenAI | 429 |
retry-after |
Einige 429, wie credit_balance_exhausted, bedeuten, dass die Wiederholung nicht hilft. Markieren Sie error.code. |
| Anthropic | 429 |
retry-after |
Eine Ausgabenobergrenze 429 hat keine retry-after und schlägt weiterhin fehl, bis der Zugriff wiederhergestellt ist. Eine überladene API gibt 529zurück , nicht 429. |
| Microsoft Graph | 429 |
Retry-After (Sekunden) |
Grenzwerte unterscheiden sich pro Dienst, z. B. SharePoint und Outlook. |
So behandeln Sie einen 429-Fehler
- Entscheiden Sie, ob Sie es überhaupt erneut versuchen möchten. Wenn der Fehler besagt, dass Ihr Kontingent, Ihr Guthaben oder Ihr Ausgabenlimit aufgebraucht ist, hilft das Wiederholen nicht. Informieren Sie den Benutzer, und lassen Sie sich benachrichtigen.
- Warten Sie so lange, wie von der API verlangt. Wenn die Antwort lautet
Retry-After, warten Sie so lange. Es ist entweder eine Anzahl von Sekunden oder ein HTTP-Datum. Wenn die API stattdessen Rate-Limit-Header verwendet, z. B. GitHubsx-ratelimit-reset, warten Sie, bis die Rücksetzzeit erreicht ist. - Andernfalls treten Sie zurück. Ohne einen Hinweis von der API versuchen Sie es mit exponentiellem Backoff und zufälligem Jitter, und hören Sie nach einigen Versuchen auf.
- Teilen Sie dem Benutzer mit, was passiert. „Vorgang läuft, erneuter Versuch in 5 Sekunden“ schlägt einen Spinner, der nie endet.
- Verlangsamen Sie sich vor dem nächsten 429-Fehler. Wenn die API Header zur Ratebegrenzung sendet, verwenden Sie die verbleibende Anzahl, um Ihre Anfragen entsprechend zu takten.
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)));
}
}
Viele SDKs versuchen Anfragen mit 429-Fehlern für Sie erneut. Beispielsweise führt das OpenAI Python SDK standardmäßig 2 Wiederholungsversuche aus, und der .NET Standardresilienzhandler wiederholt 3 Mal und berücksichtigt Retry-After. Wenn das SDK keine Wiederholungsversuche mehr ausführt, erhält Ihr Code den Fehler, sodass er weiterhin einen Plan benötigt.
So testen Sie, dass Ihre App mit 429 umgeht
Sie sehen selten eine 429 während der Entwicklung. Die API ist schnell, Sie sind der einzige Benutzer, und Ihre Testdaten sind klein. Daher entscheidet die Art und Weise, wie Sie die Behandlung von 429 testen, ob Sie die Fehler finden, bevor Ihre Benutzer dies tun.
| Approach | Was Sie finden | Was Ihnen fehlt |
|---|---|---|
| Warten auf die Produktion | Tatsächliche Ausfälle | Alles, bis ein Benutzer darauf klickt |
| Mocken Sie die API in Ihren Tests, oder lassen Sie Ihren Coding-Agenten den Mock schreiben. | Ob Ihre Wiederholungsverzweigung ausgeführt wird | Die echten Statuscodes, Header und Fehlerantworten der API und die Wiederholungsrichtlinie Ihres SDK. Ihre App benötigt außerdem einen reinen Testschalter, um den Mock zu erreichen. |
| Rufen Sie die echte API auf, bis sie Sie drosselt | Tatsächliches Verhalten | Sie können keine 429 bei Bedarf auslösen, und Sie verwenden Ihr reales Kontingent. |
| Fangen Sie den echten Datenverkehr Ihrer App ab und geben Sie bei Bedarf 429s zurück. | Echte URLs, Ihre reale SDK- und Wiederholungsrichtlinie und das eigene 429-Format der API | Nichts in Ihrer App ändert sich, sodass Ihre App Ihren Code nicht isoliert testet. Heben Sie sich die Unit-Tests dafür auf. |
Probieren Sie sie in Ihrer App aus
Dev Proxy fängt die Anforderungen Ihrer App an die von Ihnen ausgewählten APIs ab und gibt 429s zurück, wobei 429-Fehler mit den eigenen Headern und dem Fehlerformat der API zurückgegeben werden, während Ihre App die echten URLs aufruft. Außerdem erfahren Sie, wann Ihre App erneut versucht, bevor die Retry-After Zeit abgelaufen ist.
Laden Sie die Voreinstellung für die API herunter, die Ihre App aufruft, und starten Sie Dev Proxy damit:
devproxy config get github-rate-limiting
devproxy --config-file "~dataFolder/configs/github-rate-limiting/.devproxy/devproxyrc.json"
| API | Voreinstellung |
|---|---|
| GitHub | github-rate-limiting |
| OpenAI | openai-throttling |
| Anthropic | anthropic-throttling |
Microsoft Graph (OneDrive und SharePoint: /drive, /shares, /sites) |
microsoft-graph-rate-limiting |
Führen Sie dann Ihre App wie gewohnt aus, und beobachten Sie, was sie tut. Informationen zum Installieren von Dev Proxy finden Sie unter Einrichten von Dev Proxy.