Beim Senden von Anforderungen an APIs stößt du oft auf Ratenbegrenzungen, die die Anzahl der Aufrufe beschränken, die du innerhalb eines bestimmten Zeitraums durchführen kannst. GitHub Copilot Chat kann mit Codevorschlägen zum Erkennen von Ratenbegrenzungsantworten und automatischem Wiederholen von Anforderungen nach einer Wartezeit beim Umgehen mit diesen Begrenzungen helfen.
Beispielszenario
Mit dem folgenden Python-Code werden Wetterdaten aus einer externen API abgerufen. Wenn die API Ratenbegrenzungen aufweist, können bei Anforderungen Fehler auftreten, falls Grenzwerte überschritten werden. Deine App sollte über eine Möglichkeit verfügen, mit diesen Antworten durch Implementieren von Wiederholungslogik umzugehen.
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
Beispiel für Prompt
How can I handle API rate limits within get_weather().
Beispielantwort
Note
Die folgende Antwort ist ein Beispiel. Da die Copilot Chat-Antworten nicht deterministisch sind, erhältst du möglicherweise eine andere Antwort als die hier beschriebene.
Copilot kann einen Code vorschlagen, mit dem ein Wiederholungsmechanismus mit exponentiellem Backoff zum Beschränken der Wiederholungsversuchshäufigkeit implementiert wird.
Zum Beispiel:
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
In diesem Beispiel schlägt Copilot unter anderem vor, eine Wiederholungssitzung einzurichten, über die der Code Anforderungen automatisch wiederholen kann, wenn aufgrund von bestimmten Statuscodes (500, 502, 504) Fehler auftreten. Der backoff_factor
erhöht die Wartezeit zwischen den Versuchen Stück für Stück, um die Ratenbegrenzung der API nicht noch weiter zu überschreiten.