Skip to main content

Control de los límites de frecuencia de la API

Chat de Copiloto puede ayudar a controlar los límites de velocidad de API al sugerir código que los detecte e implemente la lógica de reintento.

Al realizar solicitudes a las API, es habitual encontrar límites de frecuencia que restringen el número de llamadas que se pueden realizar dentro de un período de tiempo determinado. Copilot Chat de GitHub puede ayudarle a controlar estos límites mediante la sugerencia de código para detectar respuestas de límite de velocidad y reintentar automáticamente las solicitudes después de un retraso.

Escenario de ejemplo

El siguiente código de Python captura datos meteorológicos de una API externa. Si la API tiene límites de frecuencia, las solicitudes pueden generar errores cuando se superan dichos límites y es posible que la aplicación necesite una forma de controlar estas respuestas de manera correcta mediante la implementación de lógica de reintento.

from flask import Flask, request
import requests

app = Flask(__name__)

WEATHER_API_URL = "https://api.example.com/weather"

@app.route('/get_weather', methods=['GET'])
def get_weather():
    city = request.args.get('city')
    # Simulate an API request to the external weather service
    response = requests.get(WEATHER_API_URL, params={"city": city})
    weather_data = response.json()

    return weather_data

Mensaje de ejemplo

Copilot prompt
How can I handle API rate limits within get_weather().

Respuesta de ejemplo

Nota:

La respuesta siguiente es un ejemplo. Las respuestas de Chat de Copiloto no son deterministas, por lo que puedes obtener una respuesta diferente a la aquí mostrada.

Copilot podría sugerir código que implemente un mecanismo de reintento con retroceso exponencial para limitar la frecuencia de los reintentos.

Por ejemplo:

import requests
from flask import Flask, request
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

app = Flask(__name__)

WEATHER_API_URL = "https://api.example.com/weather"

def requests_retry_session(
    retries=3,
    backoff_factor=0.3,
    status_forcelist=(500, 502, 504),
    session=None,
):
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount("http://", adapter)
    session.mount("https://", adapter)
    return session

@app.route('/get_weather', methods=['GET'])
def get_weather():
    city = request.args.get('city')
    try:
        response = requests_retry_session().get(WEATHER_API_URL, params={"city": city})
        response.raise_for_status()
        weather_data = response.json()
    except requests.exceptions.RequestException as e:
        return {"error": str(e)}, 500

    return weather_data

En este ejemplo, Copilotlas sugerencias incluyen la configuración de una sesión de reintento que permite al código reintentar automáticamente las solicitudes si se produce un error debido a códigos de estado específicos (500, 502, 504). El elemento backoff_factor aumenta gradualmente el retraso entre los reintentos, lo que ayuda a evitar que se supere aún más el límite de frecuencia de la API.

Lectura adicional