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. El GitHub Copilot Chat puede ayudarte a controlar estos límites al sugerir código para detectar respuestas de límite de frecuencia y reintentar realizar las solicitudes después de un retraso de forma automática.
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
Ejemplos de indicaciones
How can I handle API rate limits within get_weather().
Respuesta de ejemplo
Note
La respuesta siguiente es un ejemplo. Las respuestas de Copilot Chat no son deterministas, por lo que puedes obtener una respuesta diferente a la aquí mostrada.
Copilot puede 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, entre las sugerencias de Copilot se incluye configurar una sesión de reintento que permita al código reintentar las solicitudes de forma automática en caso de 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.