429 Troppe richieste: cosa significa e come gestirlo

Un'API restituisce 429 Too Many Requests quando l'app ha inviato più richieste di quante l'API consente in un periodo di tempo. La richiesta stessa va bene. L'hai inviato troppo spesso, quindi l'API l'ha rifiutato. Se si attende e lo si invia di nuovo, in genere ha esito positivo. La risposta include spesso un'intestazione Retry-After che indica quanto tempo attendere. Per altre informazioni, vedere RFC 6585, sezione 4.

Ogni API implementa limiti di frequenza in modo diverso. Il codice di stato, le intestazioni e il corpo dell'errore variano, quindi il codice che gestisce correttamente un'API può non gestire correttamente la successiva.

API Status Come capire per quanto tempo aspettare Fai attenzione a
GitHub 403 oppure 429 retry-after se presente, altrimenti x-ratelimit-remaining (secondi dell'epoca UTC) quando 0 è x-ratelimit-reset, altrimenti almeno 1 minuto Un 403 può essere un limite di frequenza o un'autorizzazione mancante. Leggere le intestazioni per distinguerle.
OpenAI 429 retry-after Alcuni 429, ad esempio credit_balance_exhausted, significano che la ripetizione dei tentativi non sarà utile. Controllare error.code.
Anthropic 429 retry-after Un limite di spesa 429 non ha retry-after e continua a non riuscire fino a quando l'accesso non riprende. Un'API in sovraccarico restituisce 529, non 429.
Microsoft Graph 429 Retry-After (secondi) I limiti variano per servizio, ad esempio SharePoint e Outlook.

Come gestire un 429

  1. Decidi se riprovare o meno. Se l'errore indica che la quota, i crediti o il limite di spesa sono esauriti, i tentativi non saranno utili. Dillo all'utente e avvisa te stesso.
  2. Attendere per tutto il tempo richiesto dall'API. Se la risposta riporta Retry-After, attendere tale tempo. Si tratta di un numero di secondi o di una data HTTP. Se l'API usa invece gli header di limitazione della frequenza, ad esempio GitHub x-ratelimit-reset, attendere fino all'ora di reimpostazione.
  3. Altrimenti, fare marcia indietro. Senza un suggerimento dall'API, riprovare con backoff esponenziale e instabilità casuale e arrestarsi dopo alcuni tentativi.
  4. Indicare all'utente cosa sta accadendo. "Occupato, riprovare in 5 secondi" batte uno spinner che non termina mai.
  5. Rallenta prima del successivo errore 429. Se l'API invia intestazioni limite di frequenza, usare il conteggio rimanente per gestire le richieste.
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)));
  }
}

Molti SDK riprovano a 429s. Ad esempio, OpenAI Python SDK ritenta 2 volte per impostazione predefinita e il gestore di resilienza standard di .NET ritenta 3 volte e rispetta Retry-After. Quando l'SDK esaurisce i tentativi, il codice riceve l'errore, quindi richiede ancora un piano.

Come testare che l'app gestisca 429

Raramente si vede un 429 mentre si sviluppa. L'API è veloce, sei l'unico utente e i dati di test sono di piccole dimensioni. Quindi, il modo in cui si testa la gestione 429 decide se si trovano i bug prima che lo facciano gli utenti.

Avvicinarsi Cosa trovi Quello che ti manca
Attendere l'ambiente di produzione Errori reali Tutto, fino a quando un utente non ci fa clic
Simula l'API nei test oppure lascia che l'agente di programmazione scriva il mock Se il ramo di ripetizione dei tentativi viene eseguito Codici di stato, intestazioni e corpi di errore reali dell'API e criteri di ripetizione dei tentativi dell'SDK. L'app richiede anche uno switch solo per test per raggiungere il mock.
Chiama l'API reale finché non ti applica il rate limiting Comportamento reale Non è possibile generare un errore 429 a comando e si usa la quota reale
Intercettare il traffico reale dell'app e restituire 429s su richiesta URL reali, l'SDK reale e i criteri di ripetizione dei tentativi e il formato 429 dell'API Niente nella tua app cambia, quindi non testa il codice in isolamento. Mantieni gli unit test per quello.

Provalo nella tua app

Dev Proxy intercetta le richieste dell'app alle API scelte e restituisce 429, con le intestazioni e il formato di errore dell'API, mentre l'app continua a chiamare gli URL reali. Indica anche quando l'app ritenta prima che scada il tempo Retry-After.

Scaricare il set di impostazioni per l'API che l'app chiama e avviare Dev Proxy con esso:

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 e SharePoint: /drive, /shares, /sites) microsoft-graph-rate-limiting

Eseguire quindi l'app come di consueto e osservare cosa fa. Per installare Dev Proxy, vedere Configurare Dev Proxy.

Passaggi successivi

Vedere anche