Skip to main content

Обработка ограничений скорости API

Copilot Chat может помочь обрабатывать ограничения скорости API, предлагая код, который обнаруживает логику повторных попыток.

При выполнении запросов к API обычно возникают ограничения скорости, ограничивающие количество вызовов, которые можно выполнять в течение определенного интервала времени. GitHub Copilot Chat помогает обрабатывать эти ограничения, предлагая код для обнаружения ответов ограничения скорости и автоматического повторения запросов после задержки.

Пример сценария

Следующий код Python получает данные о погоде из внешнего API. Если API имеет ограничения скорости, запросы могут завершиться ошибкой при превышении ограничений, и приложению может потребоваться способ обработки этих ответов, реализуя логику повторных попыток.

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

Пример запроса

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

Пример отклика

Note

Следующий ответ является примером. Ответы Copilot Chat являются недетерминированными, поэтому вы можете получить другой ответ, показанный здесь.

Copilot может предложить код, реализующий механизм повторных попыток с экспоненциальным обратным выходом, чтобы ограничить частоту попыток повторных попыток.

Например:

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

В этом примере предложения Copilotвключают настройку сеанса повторных попыток, который позволяет коду автоматически повторять запросы, если они завершаются ошибкой из-за определенных кодов состояния (500, 502, 504). Постепенно backoff_factor увеличивает задержку между повторными попытками, что помогает избежать превышения ограничения скорости API дальше.

Дополнительные материалы