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 的速率限制。

其他阅读材料